接口测试的必要性:发现前台测试发现不了的问题、检查系统的异常处理能力、检查系统的安全性和稳定性
接口测试的用例设计主要覆盖面:
通过性验证:确保正常输入时,接口正常工作
参数组合:多个参数时,组合输入参数检查接口返回结果是否符合接口文档描述
接口安全:主要有绕过验证、绕过身份验证、参数加密验证、密码复杂性验证
接口异常性验证:主要异常类型:必传非必传、参数类型、入参长度
根据业务逻辑设计用例
常用的接口测试工具:Postman、Jmeter、SoupUI
基本概念定义:
1、接口:分为程序内部接口和系统对外接口,我们常做的接口测试主要指系统对外接口的测试,即测试本系统与外部系统之间的交互点,测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等
2、前端:如web端的网页以及APP端的页面,负责前台页面的显示
3、后端:负责后台的业务逻辑、功能等的处理,前端通过接口调用实现与后台的交互
4、接口分类:webservice接口和http api接口,其中:
webservice接口:走soap协议通过http传输,请求报文和返回报文都是xml格式,可以使用soupui工具进行模拟测试
http api:走http协议,常用的请求方式有GET和POST,通过路径来区分调用的方法,请求报文一般都是key-value形式的,返回报文一般都是json串
{ HTTP只负责把数据传送过去,不会管这个数据是XML、HTML、图片、文本文件或者别的什么。而SOAP协议则定义了怎么把一个对象变成XML文本,在远程如何调用等,怎么能够混为一谈。
这样说两种协议(soap协议和http协议):
HTTP就是邮局的协议,他们规定了你的信封要怎么写,要贴多少邮票等。。。。
SOAP就是你们之间交流的协议,负责把你所需要表达的意思写在信纸上,同时也负责让对方能够看得懂你的信。
Web service一般就是用SOAP协议通过HTTP来调用它,其实他就是一个WSDL文档,客户都可以阅读WSDL文档来用这个Web service。客户根据WSDL描述文档,会生成一个SOAP请求消息。Web service都是放在Web服务器 (如IIS) 后面的,客户生成的SOAP请求会被嵌入在一个HTTP POST请求中,发送到Web服务器来。Web服务器再把这些请求转发给Web service请求处理器。请求处理器的作用在于,解析收到的SOAP请求,调用Web service,然后再生成相应的SOAP应答。Web服务器得到SOAP应答后,会再通过HTTP应答的方式把它送回到客户端。
webService协议主要包括两个方面:传输协议和数据表示,关于传输协议可以是http或其他,数据表示也可以是键值对、xml或其他,只不过现在通用的是http+soap,当然其他的也可以,不知道这样理解对不对? SOAP简单的理解,就是这样的一个开放协议SOAP=RPC+HTTP+XML:采用HTTP作为底层通讯协议;RPC作为一致性的调用途径,XML作为数据传送的格式,允许服务提供者和服务客户经过防火墙在INTERNET进行通讯交互。}
5、json:通用数据类型,什么语言都认识他,所有接口返回的都是json串,json串中字符串类型的参数值必须使用双引号,其他类型可以不添加,如:
例:{"name":"nina","data":1212}
6、GET请求:主要用来获取数据,可以直接在浏览器输入,根据浏览器和服务器的不同URL的输入长度也不同
7、Post请求:主要用来发送数据,如登录时需要传参,需要借助工具发送
8、接口规范文档:接口测试的依据,主要包含接口说明、调用url、请求方法、请求参数说明(参数名、参数类型)、返回参数说明
9、header:是服务器以http协议传html资料到浏览器前所送出的字串,在标头与 HTML 文件之间尚需空一行分隔
10、http状态码:发出http请求,响应中会有状态码,常用状态码如下:
2开头的都表示这个请求发送成功,200代表这个请求发送成功且服务器也返回了
3开头的代表重定向,302代表把这个请求重定向到别的地方了
400代表客户端发送的请求有语法错误,401代表访问的页面没有授权,403表示没有权限访问这个页面,404代表没有这个页面
500代表服务器内部异常,504代表服务器端超时,没返回结果
11、cookie:存在于本地的一个文件,如保存登录信息(加密后)
12、seesion:存在于服务器端,如cookie和seesion相匹配时实现自动登录
http接口测试:
1、直接在浏览器中输入拼接后的url,格式为url?param1=value¶m2=value【问号前面是接口请求url,后面是请求的参数名和参数值,多个参数用&来连接】
例:https://i.cnblogs.com/EditPosts.aspx?opt=1
2、如果入参是json串、需要添加header、需要添加cookie、需要上传文件时,则要通过工具进行测试,如Postman和Jmeter
接口测试工具常用方法:
Postman
HTTP的接口测试工具有很多,可以进行http请求的方式也有很多,但是可以直接拿来就用,而且功能还支持的不错的,我使用过的来讲,还是postman比较上手。
1、支持用例管理
2、支持get、post、文件上传、响应验证、变量管理、环境参数管理等功能
3、支持批量运行
4、支持用例导出、导入
5、支持云端保存用例【付费用户】
可以说POSTMAN满足了HTTP接口测试的大部分功能,只有少部分的功能不被支持,比如:请求流程的控制;前面说了这么多,接下来我们就看看POSTMAN的安装与使用吧。
POSTMAN是一个Chrome的一个插件工具,我们可以通过Chrome的应用商店进行搜索并安装,安装完成会在桌面上显示一个postman的图标,每次点击这个图标就可以启动POSTNA的界面。
启动过后就是上面的界面了,左边是用来管理用例的目录结构,右边是具体某个用例的请求内容的参数及响应内容;默认的postman会自带一个demo的项目叫“POSTMAN Echo”,里面有各种场景的用例demo,对于新上手的同学可以通过查看这些demo用例来学习如何使用POSTMAN。
直接点击左边栏上面的添加目录图标来新增一个根目录,这样就等于新建了一个项目,我们可以把一个项目或一个模块的用例都存放在这个目录之下,并且在根目录之下我们还可以在建立子目录来进行功能用例的细分,具体见下图。
创建了项目目录后我们就可以新建用例了,具体是点击右侧区域的+号来新增一个空用例的模板,也可以通过复制一个已有用例来达到新建一个用例的目的,2种方法见下:
新建的用例请求内容为空,我们需要添加相应的请求信息,这部分的操作都在右侧的信息区域,一般流程如下:
post请求的主要的特点是把请求数据放在body中,而非url后
上面的样例是post方式传输普通参数,如果我们需要发送带文件的请求时,就要改下请求格式了,具体如下:
注意上面标红框的内容,都是必须要对应上。
有些时候请求时还需要一些特定的头信息,postman同样可以完美的支持,直接点击Headers标签就可以进行请求头的信息设置
GET请求,需要添加header,Content-Type application/json
预处理主要是对一些环境变量之类的进行设置,相当于数据初始化;如图:
响应处理就是对响应结果进行分析和验证,比如检查code是不是200,内容是不是等于具体某个值,是否包含特定的值等等。
因为预处理和结果检查都是使用js作为脚本语言,所以你还可以进行任意的js可以实现的场景,来辅助测试。
全局变量我们可以自己在预处理和结果处理2个脚本环境里进行赋值,在具体的测试数据里我们就可以直接使用,具体的使用方法是为:{{variable_key}};比如你在脚本中可以设置全局变量:
postman.setGlobalVariable("username", "tester");那么在用例数据项里面我就可以这样使用,{{username}},用来代表具体的tester值,具体见下图
而环境变量的设置可使用与全局变量基本一样,只是环境变量我们还有另外一个入口可以进行设置,那就是环境配置管理中,我们可以预先建立若干和与环境相关的一套变量,根据实际的测试需求在执行前选择对应的环境变量模板,这样可以快速切换测试服务器与线上服务器之前的环境差异。比如:配置2套环境变量模板,一套url是测试环境,另一套为线上环境,根据测试对象不同我们选择不同的环境变量模板就行了,而不再需要修改测试数据中的url了。
上面我们就把请求的host提取出来,然后在不同环境变量模板里使用不同的url值,后面我们就可以通过选择不同的环境变量模板来进行对应的请求测试
POSTMAN还有一个很赞的地方就是导出用例为CODE,即如果你编写好了用例之后可以通过点击“Generate Code”来一键生成代码,并且还有好多语言和类库可以选择,帧的是棒棒哒!
最后我们再来看看POSTMAN的批量执行功能,这个功能由单独的runner来负责的,我们需要在另外的界面进行操作,具体如下:
依次点击上面的按钮就会出现runer界面,如下直接点击“Start Test”即可
Jmeter---开源性能测试工具(接口测试,压力测试)
1、新建线程组
打开Jmeter工具,右键点击测试计划,选择添加->Threads(Users)->线程组
线程数:设置最大并发值
Ramp-Up Period(in second):多少秒内启动并发数,0表示同时执行
循环次数:循环次数表示一个线程执行的次数,默认配置为1,表示执行完毕后不循环,勾选永远表示永久循环
调度器:勾选后,支持按调度器配置,其中持续时间和启动区间任选其一,不要同时选(可用于稳定性测试)
启动延迟(秒):多长时间后启动
2、添加http请求&添加查看结果树
右键点击线程组,选择添加->Sampler->HTTP请求
右键点击线程组,选择添加->监听器->查看结果树
3、添加http header管理器
右键点击线程组,选择添加->配置元件->HTTP信息头管理器
3、添加http cookie管理器
右键点击线程组,选择添加->配置元件->HTTP cookie管理器
4、添加响应断言
断言:用来检查返回结果是否正确
右键点击需要添加断言的请求,选择添加->断言->响应断言
模式匹配规则:包括和匹配支持正则表达式,Equal和Substring不支持正则表达式,包括和Substring表示返回的结果包含输入的内容,匹配和Equal返回的结果完全匹配输入的内容
要测试的模式:需要和返回结果进行对比的内容
Jmeter操作mysql
1、导入jdbc的jar包
2、创建数据库连接配置,mysql的url、端口号、账号、密码
右键点击线程组,选择添加->配置元件->JDBC Connect Configuration
Variable Name:配置数据库连接池的名称
Jmeter数据库驱动列表:
3、输入sql语句
新建线程组,右键点击线程组,选择添加->Sampler->JDBC Request
Query Type:选择sql语句的类型
4、查看sql执行结果
4、查看响应时间(压力测试)
右键点击线程组,选择添加->监听器->聚合报告
执行数据库查询后,可以查看聚合报告,检查数据库查询的处理时间,(压力测试一般运行10到15分钟)
TPS(Throughput):每秒钟处理事物数 ,tps越高表示效率越高
sample:总共发出的请求数
average:每个请求的平均响应时间,单位为毫秒
error:压测的错误率
Jmeter参数化
参数化:把需要经常变的值,改成可以变化的或者是提前设置好的一些值
Jmeter参数化的方式有三种:
1、用户定义的变量。这种是为了方便管理参数,只能有一个值,比如说ip地址不经常变化的;
2、函数生成器。函数生成器可以参照一定的规则生成数据,比如说生成一些随机数;
3、从文件中读取。文件读取就是事先写好一些数据,然后从文件中读取,这样的话,比如说登录接口,账号和密码都是我们事先注册好的。
下面整理jmeter中三种参数化的具体配置方法:
1、用户定义的变量。
在线程组中添加一个用户定义的变量,然后写key和value就可以了,key就是这个参数的名称,也就是你在脚本里面取的值,value就是具体值了。在取参数化的值的时候,使用${name}这样去取值,name就是你取的变量名称。注:用户定义的变量可以添加在线程组下面也可以添加在具体的请求下面,添加在线程组下面则整个线程组中都可以使用。添加在请求下面则只有当个请求可用。
2、函数生成器
可以按照规则生成一些参数,比如说随机数、取当前时间,最常用的就是这两种。 随机数__Random,可以在你指定的一个范围内取随机值。取当前时间__time,如果在有一些需要传时间的情况下可以使用,日期格式是: yyyy-MM-dd HH:mm:ss 年-月-日-小时:分钟:秒。取唯一id,__UUID,这个就是每次会生成一个随机的uuid,都是唯一的。
拷贝并粘贴函数助手生成的函数字符串到需要的位置即可
3、从文件中读取
从文件中读取的话,三个步骤 :
(1) 读取文件;
(2) 取文件内容里面的参数,给它一个名字;
(3) 使用值 从文件读取的话,需要在线程组里面添加一个CSV Data Set Config,它就是做前面两步的操作的。
详细配置界面如下图,注:如果文件不写绝对路径,只写一个文件名,那么你就把你的文件放到jmeter的bin目录下就OK了。