发表于: 2022-06-24 20:25:03
1 489
在nginx.conf文件上添加访问域名,指向tomcat
server {
listen 80;
server_name weixiao.com;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
proxy_pass http://localhost:9090/weixiao01_war/;
index index.html index.htm;
}
在本地hosts文件中添加访问权限:
重启nginx
启动tomcat:
使用域名访问tomcat:
postman返回数据:
任务二深度思考:
1.什么叫MVC,Spring里对应的MVC分别是什么,是怎么收到用户请求然后分发给不同的Controller的?
MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,
一种软件设计模式,用业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,
在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
而Spring MVC是一个MVC框架。Spring MVC是基于Spring功能之上添加的Web框架,想用Spring MVC必须先依赖Spring。
Spring可以说是一个管理bean的容器,也可以说是包括很多开源项目的总称,spring mvc是其中一个开源项目。
MVC框架除了Spring MVC之外还有其他的框架,如structs2、Zend Framework、.NET MVC等。
扩展资料:
MVC框架性能
SpringMVC会稍微比Struts2快。SpringMVC是基于方法的设计,而Sturts2是基于类,
每次发一次请求都会实例一个action,每个action都会被注入属性,而SpringMVC基于方法,粒度更细,但要小心把握像在servlet控制数据一样。
SpringMVC是方法级别的拦截,拦截到方法后根据参数上的注解,把request数据注入进去,在SpringMVC中,一个方法对应一个request上下文。
而Struts2框架是类级别的拦截,每次来了请求就创建一个Action,然后调用setter getter方法把request中的数据注入;
Struts2实际上是通过setter getter方法与request打交道的。
SpringMvc的执行流程
1、发起请求到前端控制器(DispatcherServlet)
2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)
3、处理器映射器HandlerMapping向前端控制器DispatcherServlet
返回Handler
4、前端控制器DispatcherServlet
调用处理器适配器HandlerAdapter
执行Handler
5、处理器适配器HandlerAdapter
执行Handler
6、Handler执行完给处理器适配器返回ModelAndView
7、处理器适配器向前端控制器返回ModelAndView
(ModelAndView是SpringMvc的底层对象包括model和view)
8、前端控制器请求视图解析器去解析视图
根据逻辑视图名解析成真正的视图(jsp)
9、视图解析器向前端控制器返回view
10、前端控制器进行视图渲染
视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域
11、前端控制器向用户响应结果
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.什么是参数校验,前端和后端需要分别做校验吗?Validation的好处和坏处分别是什么,在真实项目中需要使用Validation吗?
参数校验:为了保护自己的代码,一般都会在开发中假设所有的参数都是不可靠的。 针对所有的参数校验场景自己一次进行判断及错误信息的提示。
还有一种case,重一点的业务参数校验,有时候也会被不厌其烦地校验,散落在各个子系统或者系统的各处模块代码中
(1) 常见的参数检验方式:
1、表现层验证:SpringMVC提供对JSR-303的表现层验证,或者直接将拿到的参数在controller层里面用if判断
2、业务逻辑层验证:Spring3.1提供对业务逻辑层的方法验证
3、DAO层验证:Hibernate提供DAO层的模型数据的验证
4、数据库端的验证:通过数据库约束来进行
后端验证是为了保证安全,前端验证是为了让用户体验更好。
必须在后端校验的
唯一性验证,验证码,敏感词,出错概率高的要做异步校验。
后端校验可以防止接口被私自调用导致破坏数据库结构;避免有人模拟浏览器行为直接给服务器发请求。
有必要在前端校验的
必填项、(邮箱、电话号、地址)格式、密码强度检测。
前端校验便于用户纠正(快速反馈),并且减少服务器压力、节省流量(减少无意义的请求),主要对用户友好。
比如手机号码,邮箱号不合法,或者密码强度太弱,在前端校验可以不等后端返回,直接提醒用户不合法,让用户及时知晓并更改,
避免不必要的提交,再等待服务器返回错误信息。
验证:验证检查某样东西是否符合之前已定好的标准,如:文档评审,要检查的东西是文档,检查标准就是文档的评审标准,又如:測试软件,
要检查的东西就是软件,检查的标准就是软件的规格说明,包含功能说明,性能要求等。
确认:检查软件在终于的执行环境上是否达到预期的目标。一般来说,就是调试、验收測试等,这些工作都是在真正的软件须要执行的环境上进行的,
在终于环境上执行软件,确保软件符合使用要求
注:
Valiadation很多其它是从用户的角度或者能够是模拟用户角度来验证产品是否和自己想要的一致。从SP来看可能更easy理解这个;
Verification很多其它的是从开发方的角度来做评审、測试来验证产品的需求、架构设计等方面是否和用户要求的一致;
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3.SpringMVC分页查询和显示
分页查询就是根据需要每次只返回所需要的数据,而不用每次都从数据库中全部把数据提取出来,这样可以降低程序与数据库之间的数据传送量,
并且还可以提高程序的性能。 一般来说我们在数据量大的情况下总是会分页显示。分页查询优点:排版清晰,界面美观每页信息数量固定,
查询效率快根据用户的需要,提供适当的数据提高性能,减少内存的压力,提高访问速度
知识剖析
分页查询分为逻辑分页和物理分页
逻辑分页
逻辑分页是在用户第一次访问时,将数据库的所有记录全部查询出来, 添加到一个大集合中,然后再通过代码获取分页数据,
常用的操作是一次性从数据库中查询出全部数据并存储到List集合中,因为List集合有序,再根据索引获取指定范围的数据。
逻辑分页主要用于数据量不大、数据稳定的场合。逻辑分页一次性将数据读取到内存,占用了较大的内容空间。
而且逻辑分页一次性将数据读取到内存,数据发生改变,数据库的最新状态不能实时反映到操作中,实时性差。
物理分页
物理分页使用数据库自身所带的分页机制,例如,Oracle数据库的rownum,或者Mysql数据库中的limit等机制来完成分页操作。
因为是对数据库的数据进行分页条件查询, 所以叫物理分页。每一次物理分页都会去连接数据库。物理分页主要用于数据量较大、更新频繁的场合。
每次只读取一部分数据,占用内存空间较小。物理分页每次需要数据时都访问数据库,能够获取数据库的最新状态,实时性强。
MySQL查询语句:
1)select * from table
2)select * from table limit m,n
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
4.“内网IP+端口”和“外网IP+端口”和"域名"三种方式方式的差别是什么?什么时候用内网?什么时候用外网IP,什么时候用域名访问?
公网
公网俗称为广域网、外网、国际互联网、Internet和WAN,它是一个遍及全世界的网络,由全球无数服务器和网络终端组成,
比如国内的支付宝、微信、腾讯视频等应用。此外,像我们常说的手机4G联网、宽带WiFi联网,也是指联入公网。
内网
内网俗称为局域网、私网和LAN,相对公网而言,内网是指小范围内的计算机、手机等设备的网络互联。
例如路由器和连接路由器的手机、平板、电脑就组成了一个家庭内网。
内网规模比较小,手机在家里能够通过内网读取并播放在电脑硬盘存放的视频,但在家外就无法直接读取。
域名 (英语: Domain Name ),又称 网域 ,是由一串用点分隔的名字组成的 Internet 上某一台 计算机 或计算机组的名称,
用于在数据传输时对计算机的定位标识(有时也指地理位置)。
差异
公网只有1个,内网可以有无数个,公网和内网相互隔离,公网中的设备无法直接访问内网中的设备,内网中的设备同样无法访问公网中的设备。
IP
上网的本质是信息交换,以浏览玩机大学网站为例:手机浏览器通过网络询问玩机大学服务器,请问能让我看看你吗?玩机大学同意,
将存放网页的.html文件发送给手机浏览器,于是打开了玩机大学的网站。
手机是如何找到网站服务器发出询问,服务器又是如何找到手机返回文件的?依靠的就是IP,IP是网络世界的通信地址。
端口
如果IP像地址一样可以确定家的位置,端口则是每个家人的名字。父母可以用名字区分你与兄弟姐妹,网络设备则用端口区分已安装的各种程序服务。
比如网站的http使用80端口,https使用443端口,数据库使用3306,虫子菌的群晖NAS的远程桌面使用的是5000,端口的数量非常多,
从0到65535有几万个。
公网IP
连入公网上的每台电脑(或其它网络设备)都有1个或多个公网IP,公网IP一般要到网络运营商交钱购买或专门申请才能获取。
公网IP不能重复,比如你从电信获得公网IP114.94.18.255,那么在全世界的公网中都不会有第二个人同时使用这个IP了。
内网IP
连入内网的每台电脑(或其它网络设备)都有1个或多个内网IP,内网IP一般由路由器、网关等设备自动分配,也可以进入路由器、网关等设备手动设置。
不同局域网中的IP地址可以重复,比如你的路由器给你手机分配了内网IP 192.168.1.2 你邻居的路由器也可以给他的手机分配这个IP。
差异
想在全国各地都能随时访问存在电脑硬盘的文件、播放NAS中视频?拥有公网IP让它们连入公网是前提。
因为IP是网络世界的通信地址,没用公网IP你自然无法在公网中找到这些设备。
此外,1台设备能够同时拥有多个公网IP和内网IP,可以同时连入公网和内网。比如装宽带送的光猫,如果运营商给光猫分配了1个公网IP,
那么光猫就同时连入了由光纤连接的公网,和由电脑、手机等设备组成的内网。
域名访问和ip访问区别
ip访问对应某一台确定的服务器;
域名访问相当于在ip访问的基础上,做了一个反向代理的中间功能。例如:百度,很多人会同时使用,如果使用的是同一台服务器的话,
服务器估计会扛不住,如果访问的是域名,中间的反向代理,可以将用户反向代理到不同的服务器上,减轻服务器压力。
通过域名访问的话,一般会对用户的请求做处理,比如识别、过滤作用,即只允许符合规则的ip进行访问,其余的就要被过滤掉。
但是如果知道服务器的准确ip,就有可能避免这个问题(当然,这是在服务器的安全设置不完善的情况下才会出现),
成功访问到服务器(后续能不能成功看服务器设置,大部分是会被pass掉)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
5.内网IP和外网IP的区别是什么,在服务器上测试接口是否被防火墙屏蔽的时候,该用内网IP检测,还是该用外网IP检测?
服务器公网ip
可以用于域名解析ip,服务器远程登录ip,是最主要的服务器ip地址。
内网ip
不能用于域名解析。
不可以直接用于服务器远程登录,其主要作用是:跟当前帐号下的其他同集群的机器通信。
一些小型企业或者学校,通常都是申请一个固定的IP地址,然后通过IP共享(IP Sharing),使用整个公司或学校的机器都能够访问互联网。
而这些企业或学校的机器使用的IP地址就是内网IP,内网IP是在规划IPv4协议时,考虑到IP地址资源可能不足,
就专门为内部网设计私有IP地址(或称之为保留地址),一般常用内网IP地址都是这种形式的:10.X.X.X、
172.16.X.X-172.31.X.X、192.168.X.X等。需要注意的是,内网的计算机可向Internet上的其他计算机发送连接请求,
但Internet上其他的计算机无法向内网的计算机发送连接请求。
公网IP就是除了保留IP地址以外的IP地址,可以与Internet上的其他计算机随意互相访问。我们通常所说的IP地址,其实就是指的公网 IP。
互联网上的每台计算机都有一个独立的IP地址,该IP地址唯一确定互联网上的一台计算机。这里的IP地址就是指的公网IP地址。
其实,互联网上的计算机是通过“公网IP+内网IP”来唯一确定的,就像很多大楼都是201房间一样,房间号可能一样,
但是大楼肯定是唯一的。公网IP地址和内网IP地址也是同样,不同企业或学校的机器可能有相同的内网IP地址,但是他们的公网IP地址肯定不同。
那么这些企业或学校的计算机是怎样IP地址共享的呢?这就需要使用NAT(Network Address Translation,网络地址转换)功能。
当内部计算机要连接互联网时,首先需要通过NAT技术,将内部计算机数据包中有关IP地址的设置都设成NAT主机的公共IP地址,
然后再传送到Internet,虽然内部计算机使用的是私有IP地址,但在连接Internet时,就可以通过NAT主机的NAT技术,
将内网我IP地址修改为公网IP地址,如此一来,内网计算机就可以向Internet请求数据了。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
6.在Linux服务器上,有哪些工具是可以测试接口的,怎么用Wget或者是Curl分别发送Rest的四种请求?
首先,什么是接口呢?
接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。
系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你提供一个他们写好的方法来获取数据,
你引用他提供的接口就能使用他写好的方法,从而达到数据共享的目的,比如说咱们用的app、
网址这些它在进行数据处理的时候都是通过接口来进行调用的。
程序内部的接口:方法与方法之间,模块与模块之间的交互,程序内部抛出的接口,比如bbs系统,有登录模块、发帖模块等等,
那你要发帖就必须先登录,要发帖就得登录,那么这两个模块就得有交互,它就会抛出一个接口,供内部系统进行调用。
一、常见接口:
1、webService接口:是走soap协议通过http传输,请求报文和返回报文都是xml格式的,我们在测试的时候都用通过工具才能进行调用,测试。
可以使用的工具有SoapUI、jmeter、loadrunner等;
2、http api接口:是走http协议,通过路径来区分调用的方法,请求报文都是key-value形式的,返回报文一般都是json串,
有get和post等方法,这也是最常用的两种请求方式。可以使用的工具有postman、RESTClient、jmeter、loadrunner等;
二、前端和后端:
在说接口测试之前,我们先来搞清楚这两个概念,前端和后端。
前端是什么呢,对于web端来说,咱们使用的网页,打开的网站,这都是前端,这些都是html、css写的;对于app端来说呢,
它就是咱们用的app,android或者object-C(开发ios上的app)开发的,它的作用就是显示页面,让我们看到漂亮的页面,
以及做一些简单的校验,比如说非空校验,咱们在页面上操作的时候,这些业务逻辑、功能,比如说你购物,发微博这些功能是由后端来实现的,
后端去控制你购物的时候扣你的余额,发微博发到哪个账号下面,那前端和后端是怎么交互的呢,就是通过接口。
前面说的你可能不好理解,你只需记住:前端负责貌美如花,后端负责挣钱养家。
三、什么是接口测试:
接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。
测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
OK,上面是百度百科上说的,下面才是我说的
其实我觉得接口测试很简单,比一般的功能测试还简单(这话我先这样说,以后可能会删O(∩_∩)O哈!),现在找工作好多公司都要求有接口测试经验,
也有好多人问我(也就两三个人)什么是接口测试,本着不懂也要装懂的态度,我会说:
所谓接口测试就是通过测试不同情况下的入参与之相应的出参信息来判断接口是否符合或满足相应的功能性、安全性要求。
我为啥说接口测试比功能测试简单呢,因为功能测试是从页面输入值,然后通过点击按钮或链接等传值给后端,而且功能测试还要测UI、前端交互等功能,
但接口测试没有页面,它是通过接口规范文档上的调用地址、请求参数,拼接报文,然后发送请求,检查返回结果,所以它只需测入参和出参就行了,
相对来说简单了不少。
四、接口都有那些部分组成呢?
首先,接口文档应该包含以下内容:
1、接口说明
2、调用url
3、请求方法(get\post)
4、请求参数、参数类型、请求参数说明
5、返回参数说明
由接口文档可知,接口至少应有请求地址、请求方法、请求参数(入参和出参)组成,部分接口有请求头header。
标头 (header):是服务器以HTTP协议传HTML资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔,一般存放cookie、token等信息
有同学问我header和入参有什么关系?它们不都是发送到服务器的参数吗?
OK,首先,它们确实都是发送到服务器里的参数,但它们是有区别的,header里存放的参数一般存放的是一些校验信息,比如cookie,
它是为了校验这个请求是否有权限请求服务器,如果有,它才能请求服务器,然后把请求地址连同入参一起发送到服务器,
然后服务器会根据地址和入参来返回出参。也就是说,服务器是先接受header信息进行判断该请求是否有权限请求,判断有权限后,
才会接受请求地址和入参的。
五、为什么要做接口测试:
大家都知道,接口其实就是前端页面或APP等调用与后端做交互用的,所以好多人都会问,我功能测试都测好了,为什么还要测接口呢?
OK,在回答这个问题之前,先举个栗子:
比如测试用户注册功能,规定用户名为6~18个字符,包含字母(区分大小写)、数字、下划线。
首先功能测试时肯定会对用户名规则进行测试时,比如输入20个字符、输入特殊字符等,但这些可能只是在前端做了校验,
后端可能没做校验,如果有人通过抓包绕过前端校验直接发送到后端怎么办呢?试想一下,如果用户名和密码未在后端做校验,
而有人又绕过前端校验的话,那用户名和密码不就可以随便输了吗?如果是登录可能会通过SQL注入等手段来随意登录,
甚至可以获取管理员权限,那这样不是很恐怖?
所以,接口测试的必要性就体现出来了:
①、可以发现很多在页面上操作发现不了的bug
②、检查系统的异常处理能力
③、检查系统的安全性、稳定性
④、前端随便变,接口测好了,后端不用变
六、接口测试怎么测:
在进行接口测试前,还需要了解:
1)、GET和POST请求:
如果是get请求的话,直接在浏览器里输入就行了,只要在浏览器里面直接能请求到的,都是get请求,如果是post的请求的话,
就不行了,就得借助工具来发送。
GET请求和POST请求的区别:
1、GET使用URL或Cookie传参。而POST将数据放在BODY中。
2、GET的URL会有长度上的限制,则POST的数据则可以非常大。
3、POST比GET安全,因为数据在地址栏上不可见。
4、一般get请求用来获取数据,post请求用来发送数据。
其实上面这几点,只有最后一点说的是比较靠谱的,第一点post请求也可以把数据放到url里面,get请求其实也没长度限制,
post请求看起来参数是隐式的,稍微安全那么一些些,但是那只是对于小白用户来说的,就算post请求,你通过抓包也是可以抓到参数的。
所以上面这些面试的时候你说出来就行了。
http状态码
每发出一个http请求之后,都会有一个响应,http本身会有一个状态码,来标示这个请求是否成功,常见的状态码有以下几种:
1、200 2开头的都表示这个请求发送成功,最常见的就是200,就代表这个请求是ok的,服务器也返回了。
2、300 3开头的代表重定向,最常见的是302,把这个请求重定向到别的地方了,
3、400 400代表客户端发送的请求有语法错误,401代表访问的页面没有授权,403表示没有权限访问这个页面,404代表没有这个页面
4、500 5开头的代表服务器有异常,500代表服务器内部异常,504代表服务器端超时,没返回结果
接下来再说接口测试怎么测:
1)、通用接口用例设计
①、通过性验证:首先肯定要保证这个接口功能是好使的,也就是正常的通过性测试,按照接口文档上的参数,正常传入,是否可以返回正确的结果。
②、参数组合:现在有一个操作商品的接口,有个字段type,传1的时候代表修改商品,商品id、商品名称、价格有一个是必传的,
type传2的时候是删除商品,商品id 是必传的,这样的,就要测参数组合了,type传1的时候,只传商品名称能不能修改成功,
id、名称、价格都传的时候能不能修改成功。
③、接口安全:
1、绕过验证,比如说购买了一个商品,它的价格是300元,那我在提交订单时候,我把这个商品的价格改成3元,
后端有没有做验证,更狠点,我把钱改成-3,是不是我的余额还要增加?
2、绕过身份授权,比如说修改商品信息接口,那必须得是卖家才能修改,那我传一个普通用户,能不能修改成功,我传一个其他的卖家能不能修改成功
3、参数是否加密,比如说我登陆的接口,用户名和密码是不是加密,如果不加密的话,别人拦截到你的请求,就能获取到你的信息了,
加密规则是否容易破解。
4、密码安全规则,密码的复杂程度校验
④、异常验证:
所谓异常验证,也就是我不按照你接口文档上的要求输入参数,来验证接口对异常情况的校验。比如说必填的参数不填,输入整数类型的,
传入字符串类型,长度是10的,传11,总之就是你说怎么来,我就不怎么来,其实也就这三种,必传非必传、参数类型、入参长度。
2)、根据业务逻辑来设计用例
根据业务逻辑来设计的话,就是根据自己系统的业务来设计用例,这个每个公司的业务不一样,就得具体的看自己公司的业务了,
其实这也和功能测试设计用例是一样的。
举个例子,拿bbs来说,bbs的需求是这样的:
1、登录失败5次,就需要等待15分钟之后再登录
2、新注册的用户需要过了实习期才能发帖
3、删除帖子扣除积分
像这样的你就要把这些测试点列出来,然后再去造数据测试对应的测试点。
七、用什么工具测
接口测试的工具很多,比如 postman、RESTClient、jmeter、loadrunner、SoapUI等,
首推的测试工具是postman和jmeter(测试框架的话,可以选择Robot Framework Pytest等),
接下来就简单介绍下如何使用这两款工具进行接口测试,其他工具本次暂不介绍。
1)、Postman是谷歌的一款接口测试插件,它使用简单,支持用例管理,支持get、post、文件上传、响应验证、变量管理、环境参数管理等功能,
可以批量运行,并支持用例导出、导入。
jmeter是一款100%纯Java编写的免费开源的工具,它主要用来做性能测试,相比loadrunner来说,
它内存占用小,免费开源,轻巧方便、无需安装,越来越被大众所喜爱。
注:以下用例中所用地址皆为本人在本地所搭的环境,外网无法访问,见谅。
①、获取用户信息:该接口用于通过userid获取用户信息
请求地址:http://192.168.1.102:8081/getuser
请求方式:POST/GET
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
7.PostMan是什么,为什么要使用他来测试接口,除了Postman,还有哪些工具可以测试?
postman说明:
Postman是一种网页调试与发送网页http请求的chrome插件。我们可以用来很方便的模拟get或者post或者其他方式的请求来调试接口。
为什么要用postman测试接口:
首先在项目的初期,测试人员提前介入,进行接口测试模拟客户端与服务端的交互。有问题提前抛出来。保证接口调用是没问题的。
其次,接口测试完成之后在进行系统测试,会轻松很多。明白了各个接口在做什么,各个参数的模拟实际上就是业务场景的模拟。
系统测试出现一些问题更快速的定位是客户端还是服务端出问题。最后接口最省时,省力,而且收益很高。
另外,接口是获取和操作资源的方式,而大部分系统和产品中,资源一般都是产品的核心,比如微信核心资 源就是通讯录关系链和聊天记录等,
因此资源是必测的。而接口中大部分的内容是数据,通过数据的对比我们能推测到系统和产品的逻辑,测接口就是测逻辑。
最后接口中的返回相对单纯,不像web页面,html代码中有太多ui的东西,ui最不稳定,变化太快,接口相对稳定一点点,
但是里面的干扰信息更少,断言相对容易很多。
1.SoupUI
SoapUI是一个开源测试工具,通过soap/http来检查、调用、实现Web Service的功能/负载/符合性测试。
该工具既可作为一个单独的测试软件使用,也可利用插件集成到Eclipse,maven2.X,Netbeans 和intellij中使用。
SoapUI是一个自由和开放源码的跨平台功能测试解决方案。通过一个易于使用的图形界面和企业级功能,SoapUI让您轻松,
快速创建和执行自动化功能、回归、合规和负载测试。在一个测试环境,SoapUI提供完整的测试覆盖,并支持所
有的标准协议和技术。
SoapUI 基于Java 开发,支持多个平台,安装非常简单。
这个是一个开源免费和,企业版收费的软件。在国外的接口测试,使用非常多。这个工具能够支持接口自动化测试和接口性能测试,也能支持和jenkins做持续集成测试。了解一下就可以,自己可以下载一个社区免费版,做一个demo试试。
2.Java代码做接口测试
代码是万能,笔记工具也是代码开发出来的。为什么要用代码做接口自动化测试呢。因为,有些工具功能是有限制,
很多公司,需要一些特定的功能,工具不支持,只好用代码进行开发。一般用Java做自动化测试,主要是利用httpclient.jar
这个包,然后利用junit或者testng这样的单元测试工具,进行测试用例的开发,然后在jenkins上创建一个job,进行持续集成测试。
3.Python代码做接口测试
和Java一样,Python中利用一个很好,功能强大的第三方库requests,能够方便都创建接口自动化用例。
python下单元测试框架,一般采用unittest。生成测试报告,一般选择HTMLTestRunner.py。同样,可以和jenkins做持续集成测试。
4.LoadRunner
不要以为LR只能做性能测试,loadrunner同样可以做接口自动化和接口压力测试。只是我们很多人,不会利用LR的函数,进行开发接口测试用例。
5.JMeter
JMeter同loadrunner一样,都是以性能测试出名,一般用JMeter也是做接口性能测试。例如java+Jmeter+ant+jenkins做接口性能监听测试。
以上介绍了这么多工具,基本覆盖了接口功能测试,接口自动化测试,接口性能测试。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
8.该怎么模拟假数据,为什么在真实项目中,我们通常都是先定义接口,再写假数据,再去写业务逻辑?
假数据是什么类型的
假数据是JSON类型的。JSON是JS对象对象表示法,它使用javascript语法来描述数据对象。JSON语法是JS语法的子集,
但JSON任然独立于语言和平台,它是存储和交换文本信息的语法,是轻量级的文本数据交换格式,所以我们使用JSON格式来提供假数据。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
9.对Service返回的结果是否要打日志,应该打什么样的日志,为什么?
在软件开发中,散布于应用中多处的功能被称为横切关注点(cross-cutting concern)。
通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的。
比如:日志、声明式事物、安全和缓存。这些东西都不是我们平时写代码的核心功能,但许多地方都要用到。
如果按照面向对象的设计方法来打印日志,我们就必须在要打印日志的类中都加入日志的内容。
就是因为面向对象的设计让类与类之间无法联系,而不能将这些重复的代码统一起来。
把这些横切关注点与业务相分离正是面向切面编程(AOP)要解决的问题。简单的说就是把这些许多地方都要用到,
但又不是核心业务的功能,单独剥离出来封装,通过配置指定要切入到指定的方法中去。
知识剖析
在运行时,动态地将代码切入到类的指定方法、指定位置上,把逻辑代码和处理琐碎事务的代码分离开,以便能够分离复杂度。
这种编程思想就是面向切面的编程。横切关注点可以被模块化为特殊的类,这些类被称为切面(aspect)。这样做有两个好处:
每个关注点都集中于一个地方,而不是分割到多处代码中。服务模块更简洁,因为它们只包含主要关注点(或核心功能)的代码,
而次要关注点的代码被转移到切面中了。
连接点(Join point)
连接点是在应用执行过程中能够插入切面的一个点。这个点可以是调用方法时、抛出异常时、甚至修改一个字段时。
切面代码可以利用这些点插入到应用的正常流程之中,并添加行为。
切点(Pointcut )
如果说通知定义了切面“是什么”和“何时”的话,那么切点就定义了“何处”。比如我想把日志引入到某个具体的方法中,这个方法就是所谓的切点。
切面(Aspect)
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容,他是什么,在何时和何处完成其功能。
引入(Introduction)
引入允许我们向现有的类添加新的方法和属性(Spring提供了一个方法注入的功能)
织入(Weaving)
把切面应用到目标对象来创建新的代理对象的过程
通知(Advice)
在AOP中,切面的工作被称为通知。通知定义了切面“是什么”以及“何时”使用。除了描述切面要完成的工作,
通知还解决了何时执行这个工作的问题.Spring切面可以应用5种类型的通知
前置通知(Before):在目标方法被调用之前调用通知功能
后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么
返回通知(After-returning):在目标方法成功执行之后调用通知
异常通知(After-throwing):在目标方法抛出异常后调用通知
环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
10.对Service返回的结果是否要判空,为什么?
主要从软件设计原则中的健壮性入手来谈谈自己的理解
健壮性是软件设计时非常重要的一个指标,是指软件对于规范要求以外的输入情况的处理能力。
所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式
通俗点说就是不能只考虑正常情况,还要考虑异常情况.而且根据"墨菲定律",只要你能想到某种异常情况可能会发生,
那么这种异常情况就一定会发生.所以这时候对异常情况的处理就至关重要,必不可少.
对Service返回的结果是否要判空,为什么?
答案是:绝大多数情况下都需要对Service返回的结果进行判空.
通常调用service之后返回的结果有两种用途:
一种是作为下一个操作的入参.在这种情况下就必须要判空
另外一种是作为最后的结果返回.在这种情况下还需要继续细分;如果这个结果可以为空,那么就不用判断,直接返回,
如果这个结果不能为空,那么还要继续判断,并要处理异常情况.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
11.在Controller里应该怎么处理Service的异常,大段的Try Catch 会有什么坏处?
异常类分两大类型:Error类,Exception类:
Error类代表了编译和系统的错误,不允许捕获;属于JVM运行中发生的一些错误,虽然并不属于开发人员的范畴,
但是有些Error还是由代码引起的,比如StackOverflowError经常由递归操作引起
Exception分为两种,检查类型(checked)和未检查类型(unchecked)。
检查类型的异常就是说要程序员明确的去声明或者用try..catch语句来处理的异常,而非检查类型的异常则没有这些限制。
异常的处理
针对预期可能发生的异常(检查类型(checked)),在代码手动处理异常可以try/catch捕获,可以向上抛出,可以声明。
针对运行时异常,只能通过规范代码质量、在系统测试时详细测试等排除运行时异常。
在Controller里,大段的Try Catch会有什么坏处?
(1)try catch的代价比较大。相对于判断返回值,抛出异常到捕获,需要更多的cpu指令和代码
(2)Java的异常机制是由JVM控制的,业务逻辑复杂的情况下,会影响controller的执行效率
解决方案
(1)用错误码控制业务流程,需要对每个接口的返回都要做一个错误码的校验。
(2)自定义异常处理类,使用springMVC提供的统一的异常处理方式
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
12.怎么查看Nginx的访问请求时间,多少的响应时间是合理的,并发1000和单线程访问的差别是什么,Nginx可以支持多少并发,Tomcat可以支持多少并发,为什么要在Tomcat之前配置一个Nginx?
nginx比较强大,可以针对单个域名请求做出单个连接超时的配置. proxy_read_timeout: 连接成功后_等候后端服务器响应时间,
其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间) nginx使用proxy模块时,默认的读取超时时间是60s。
并行和并发的区别
并发:指多个事情在同一时间段内同时发生。一个处理器可以同时处理多个任务,这是逻辑上的同时发生。
并行:指多个事情在同一时间点上同时发生。多个处理器同时处理多个不同的任务,这是物理上的同时发生。
进程和线程
进程:进程是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个用用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
线程:线程是进程的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程,也可以包含多个线程。
操作系统中可以拥有多个进程,一个进程里可以拥有多个线程,线程在进程内执行。
主线程:执行主方法的线程。JVM执行main方法,main方法会进入到栈内存,JVM会找操作系统开辟一条main方法通向CPU的执行路径,
CPU就可以通过这条路径来执行main方法,这个路径就叫做main(主)线程。
单线程就是进程只有一个线程
多线程就是进程有多个线程
单线程:单线程在程序执行时,执行从main方法开始,从上到下依次执行。
单核心单线程:CPU在多个线程之间做高速切换,轮流执行多个线程
但是单线程如果出错就会出现中断,后续代码无法执行。
多线程:程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,
也就是说允许单个程序创建多个并行执行的线程来完成各自的任务.(下载电影的同时可以听歌),多个线程之间互不影响
4核心8线程:有8个线程,可以同时执行8个线程,8个线程在多个任务之间做高速切换,
速度是单线程CPU的8倍(每个任务执行到的几率都被提高了8倍)
Nginx可以支持多少并发?Tomcat可以支持多少并发?
Tomcat 并发数1200
nginx反向代理并发数 2w 官网是5w
为什么要在Tomcat之前配置一个Nginx?
1、从应用方面
tomcat一般是做动态解析才会用得到,支持jsp的解析,需要配置JDK支持。
nginx,则一般是做静态,本身不具备动态解析功能,需要配置其他插件或通过其他软件协同才具备动态功能,
比如php,tomcat,或者proxypass到win2008的iis服务器做ASP的动态链接等,但nginx在静态上的功能非常强大,
也可做访问控制,而且可以做成各种协议负载服务器,包括流媒体的也可以做,具体得去官方网站去看;
2、在性能方面
如果再不做系统调优的情况下,tomcat一般支持并发并不高100个差不多了;nginx在静态方面支持并发轻松达几万。
收获:以上
明天计划:将任务二的深度思考总结
评论