第九章 接口测试:jmeter、postman
一,接口测试流程,怎么做
第一步:通过分析API文档和需求文档提取接口清单 。
第二步:针对接口清单,做单接口测试和关联接口测试。
接口文档--接口用例--工具脚本设计--执行--bug--回归
二,用什么工具:jmeter、postman
它们算是同类型工具,可能界面操作不太一样,我可能习惯用Jmeter,而且,postman能做的Jmeter都能做,但Jmeter能做的postman不一定能做
Jmeter最大的特点就是组件化,使用Jmeter时, 默认自带一个组件也就是 TestPlan测试计划, 然后在TestPlan下新增Thread group线程组, 再去添加对应协议请求Sampler即可。
Postman是更容易上手,界面更简洁。主要就是针对HTTP请求,其中Collection组件等价于TestPlan测试计划, 允许添加子文件夹等价于TestSuite测试套件,用于存储所有已编写好的脚本,每个请求都是一个用例脚本。
从功能支持来看,明显Jmeter支持的请求更多,还能做性能测试,开源免费
三,Jmeter主要元件
1、测试计划:是使用 JMeter 进行测试的起点,它是其它 JMeter测试元件的容器
2、线程组:代表一定数量的用户,它可以用来模拟用户并发发送请求。实际的请求内容在Sampler中定义,它被线程组包含。
3、配置元件:维护Sampler需要的配置信息,并根据实际的需要修改请求的内容。
4、前置处理器:负责在请求之前工作,常用来修改请求的设置
5、定时器:负责定义请求之间的延迟间隔。
6、取样器(Sampler):是性能测试中向服务器发送请求,记录响应信息、响应时间的最小单元,如:HTTP Request Sampler、FTP Request Sample、TCP Request Sample、JDBC Request Sampler等,每一种不同类型的sampler 可以根据设置的参数向服务器发出不同类型的请求。
7、后置处理器:负责在请求之后工作,常用获取返回的值。
8、断言:用来判断请求响应的结果是否如用户所期望的。
9、监听器:负责收集测试结果,同时确定结果显示的方式。
10、逻辑控制器:可以自定义JMeter发送请求的行为逻辑,它与Sampler结合使用可以模拟复杂的请求序列。
四, 接口测试怎么测的
使用Jmeter进行接口测试的基本步骤如下:
1.测试计划
2.线程组
3.HTTP Cookie管理器
4.Http请求默认值
5.Sampler(HTTP请求)
6.断言
7.监听器(查看结果树、图形结果、聚合报告等)
jmeter-http接口测试脚本
jmeter进行http接口测试的主要步骤(在测试计划中 1.添加线程组 2.添加http请求 3.在http请求中写入接口的URL,路径,请求方式,参数 4.添加查看结果树 5.调用接口,查看返回值)
①
打开Jmeter 安装包,进入\bin 中,找到"jmeter.bat", 点击打开即可。
在下图打开的Jmeter 页面中,右键“测试计划” -> “添加” -> "Threads(Users)" / 线程(用户) -> “线程组”, 建立线程组。
右键“线程组” -> “添加” -> “Sample” -> “HTTP请求”, 输入“服务器名称或IP”(注意: “服务器名称或IP”中不用输入http://, 请求时会自动加入),对应的端口号(https协议默认的端口号是443,http协议默认端口号是80)。选择请求方式, 输入对应的路径,添加参数及值。

右键“线程组” -> “添加” -> “监听器” -> “察看结果数”, 添加“察看结果数”, 以察看运行后的结果,

建立线程组,HTTP请求和聚合报告,在这一个设置当中把url地址,请求类型这些配置好,参数写好,线程组里面写上线程数,比如50个用户就配50,去压3分钟,去看聚合报告中的数据,比如错误率,吞吐量,平均时间,在不断的去加用户量,调这个线程数,看吞吐量(服务器每秒处理)的变化,达到峰值,那就可以得到它的性能指标
持续施压 负载测试 在页面上添加线程的时候,是否持续,无限循环勾上,下面有个设置时间,3600秒 1个小时嘛,持续跑,持续加压,看下服务器怎么跑
得出什么结果
一,接口文档怎么去分析
①接口包含什么内容:
接口:前端(发送的请求,传参)服务器(接受并返回数值)
(前端)请求(url地址,请求方式,请求头信息,请求体信息,参数),(服务器)响应(响应状态码,响应数据格式,响应信息头,响应的内容以及异常的返回信息和错误代码)
接口三要素:地址,参数,返回值
请求地址:输入的是url地址
输入:参数值
返回值:返回界面(提供结果)
②需要分析多个接口之间彼此的关联和关系
Soapui主要有请求地址,请求参数,请求方式get、post
1, 根据接口文档,
2, 什么类型的请求,接口的IP地址,路径地址,协议,请求方式
3, 工具:postman
4, 传正确的值,看接口能不能跑通,数据落地,
5, 异常值,空值,看返回结果
二,没有接口文档怎么办?
利用抓包工具
三,接口用例设计,关注点,和功能测试用例的区别
接口测试的重点是要检查数据的交换,传递和控制管理过程,以及系统间的相互逻辑依赖关系等。
1、先看接口文档,弄懂业务逻辑;
2、保证接口功能正常运行,输入正确的参数是否能得到正确的输出参数;
3、考虑输入参数的异常情况(必填项、长度、类型、空值、增减参数个数),接口是否做了相应处理;
4、接口之间的调用链路是否正确,看上一个接口输出是否作为输入参数传入下一个接口中;
5、数据库入库的数据是否正确;
6、考虑安全性:有些设计安全的接口是否做了验签加密、当我们构造一些 SQL 注入的数据是否能正常处理;
7、考虑性能:接口测试完成后,进行相应的性能测试以及压力测试,看看频繁访问接口后承载能力如何,各个数据指标是否满足要求。
四,你之前的公司多少接口,写了多少用例,就一个接口对应多少用例
我们当时的项目接口我记得有200个左右
正常情况下,一个接口可以写出5-12条以上的测试用例
五,如何判断接口返回数据正确
人工判断
自动判断--断言方式
六,具有代表性的接口例子
接口测试中印象深刻的bug
bug描述,原因
七,涉及到第三方接口,怎么测试
能直接调用的
不能直接调用的,mock数据
八,请求参数是加密的,怎么处理
(1)写个函数或者方法,把要加密的参数使用这个函数过滤一遍,等于就是说把数据丢进去,加密了之后,再通过这个加密好的数据传输过去就可以。
(2)至于用什么加密算法,这个要根据产品和自己的业务场景和需求不管是AES或者公钥私钥也好看自己的选择。
(3)也可能是编码的问题,就直接用base64码把需要传输加密的东西通过base64返回base64码,然后再放进去,然后再进行传输。
(4)这是编码不是加密,真的要加密的话,首先把要用的参数加好密之后再被传输出去,传输的过程中把传输的数据进行一次加密和封装之后再发送过去。
(5)用jmeter做接口测试用post-processor加beanshell进行加密解密,再从日志中查找参数,然后具体的加密算法要看需求。
(6)每个测试工具提供的加密算法是不一样的,工具不一样加密算法也是不一样的。
九,涉及到短信验证码,图片验证码的接口,怎么处理
1、找开发去要一个万能的验证码
2、让开发屏蔽掉验证码
3、调用获取验证码的接口
1.短信验证码:输入手机号,获得验证码,一般验证码为数字。需要获取从后端生成的原始数据,可以通过数据库查询等
2.图形验证码:网页中登录使用的验证码,一般是服务器后端生成的验证码,将验证码绘制成图片,采用图像识别等方法
3.复杂验证码:需要调用人工代码平台
一,鉴权方式,对token,session,cookie理解和区别
目的都是一样的:鉴权和认证。总结下来就是:session 是空间换时间,token 是时间换空间。

二, 接口测试中需要用到上一个接口的信息,怎么办?
参数传递,把上个接口的返回数据里的依赖数据提取出来设置为变量然后再引用
用csv文件,去把读取到一个文件里面,如果临时一个参数,设置为一个参数,下个接口就调用这个参数
比如登录token
“请求” 右键->添加--后置处理器--json提取器
作用:json提取器,把接口返回的数据提取出来--登录--token,作为变量
①Names of created variables
由英文分号 ;分隔的变量名称,这些变量分别用于存储对应JSON-PATH表达提取的结果(必须匹配JSON-PATH表达式数量)。
eg:login_token
②JSON Path Expressions
由分号分号 ;分割的JSON-PATH表达式 (必须匹配变量的数量)
eg: $.data.token

下个接口请求时引用
eg:路径后添加&token=${login_token}
③Default Values
如果对应变量的JSON-PATH表达式不返回任何结果时,对应变量的默认值,由英文分号 ;分隔(必须匹配变量的数量)
④Match Numbers
对于每个JSON-PATH表达式,如果表达式查询到多个结果时,你可以选择提取那个值作为变量值。
0 表示随机(匹配数字的默认值)
-1 提取所有结果,这些结果将存储到名为<variable name>_N的变量(N取值从1到提取结果的数量)
X 表示提取第X个结果。如果第X个结果不存在,则不会返回任何值,直接使用对应默认值作为变量。
这些匹配数字必须使用英文分号相隔,且匹配JSON-PATH表达式的数量。如果不配置匹配数字,默认使用0作为每个表达式的默认值。
注意:不管对应的JSON-PATH表达式能否查询到结果,程序都会将结果数(如果查询不到结果则设置为 0 )存储到变量 <variable name>_matchNr中
⑤Compute concatenation var
如果勾选,则表示如果对应表达式查询到多个结果,插件将使用 , 连接这些值并存储为命名为<variable name>_ALL的变量中。

三,测试片段是做什么的?
1,右键“测试计划” ->添加--->测试片段
2,导出测试片段 .jmt文件
3,其他人使用时右键“线程组” ->添加--->逻辑控制器--->include控制器--->浏览文件名,选择导出的测试片段
测试片段就是对于用例的描述,模块化的封装,分模块测试 时重复使用的功能
四,多个测试环境,接口用例复用
不同环境间接口一般是不变的,服务器地址会有变化
解决方案:自定义变量,将服务器名称或ip ,端口号 看成公共参数
1,“线程组” ->添加--配置元件--用户定义的变量,将对应的公共数据以变量的形式,统一维护起来
用户定义的变量:名称 值 描述
eg: 名称 host 值 member.bilibili.com 描述 服务器名称或ip
名称 port 值 80 描述 端口
2,服务器名称或ip 输入 ${host} ,端口号 输入 ${port}
3,变量改动后,接口调用自动引用最新的数据
五,多组数据测试,数据驱动测试(DDT)
同一个接口,正反向多组数据测试,(正常,异常,空值)
需要的数据集:
1、测试执行需要的参数变量
2、结果判断的预期值
初级方法,手动修改参数值,然后执行测试
解决方案:可以把这些数据统一定义在一个文件里面,自动的去调用
1,按照特定规则写在csv文件,去读取(比如每一行 代表一组数据,参数与参数之间用逗号分隔),也可以从数据库中导出csv文件,然后将文件用于jmeter进行多次调用
2,“线程组” ->添加--配置元件--csv data set config
①文件名:选择csv文件
②文件编码:UTF-8
③变量名称:
④分隔符:
⑤忽略首行:
实现功能:jmeter去读取csv文件,把数据动态定义为变量
3,“线程组” ->添加--逻辑控制器--循环控制器
循环次数:多少数据就写多少次
实现功能:反复执行某件事,循环发起多次接口调用
如果不添加,不管csv文件中有多少组数据,都只会执行一次
注意:将csv数据文件设置和接口请求,断言放在循环控制器下
六,结果验证,添加断言
“请求” 右键->添加--断言--响应断言/json断言/XML断言
最常用的:json断言
①Assert JSON Path exists:判断是否存在某个值,填写 JSONPath 表达式。如果未找到路径,断言失败。
eg: $.code 判断是否存在code字段
②Additionally assert value :额外断言值,文本验证,此处是完全匹配,如果勾选这个选项,下面的Expected Value对话框会变为可用状态,在文本框中输入预期结果,执行脚本时,就会自动根据设定的json路径获取实际结果,
若实际结果和预期结果相同,则断言通过。
若不相同,则会提示断言不通过。
③Expected Value 填写预期值
④Match as regular expression:若勾选,则Expected Value对话框中可以输入正则表达式。
⑤Expect Null:若需要断言的对象返回值为空时,勾选这个选项。
⑥Invert assertion :反选。若断言结果为True,勾选该选项后,返回结果为False
注意: 判断多个值就添加多个json断言
* 把结果也放在csv文件中,json断言中Expected Value填写变量$(code)
这样就能应对调用不同参数,输出不同结果的断言判断
七,测试报告
在启动jmeter之后,生成性能测试报告
命令行进入JMeter的bin目录下输入:
jmeter -n -t 上面测试文件保存的位置\文件名.jmx -l 生成测试报告的路径\生成测试报告的名.jtl -e -o 生成html类型测试报告的路径\生成html测试报告的名字
例如我的:

D:\app\jmeter\apache-jmeter-4.0\bin>jmeter -n -t D:\app\jmeter\apache-jmeter-4.0\bin\2006c\test性能测试报告.jmx -l F:\测试\性能测试报告\a.jtl -e -o F:\测试\性能测试报告\性能测试
注意:以上所有生成的文件不能是目录中已有的(会自动生成,不用自己瞎创建)
参数说明
n:非GUI模式执行JMeter;
t:脚本文件(.jmx文件)的路径;
l:指定生成测试结果的保存文件(.jtl格式),此文件必须不存在;
e:测试结束后,生成测试报告;
o:用于存放测试报告的路径;
如果想查看html类型的测试报告,就打开生成的测试报告文件夹,找到index.html,用浏览器打开即可
例如我的生成的文件夹名为性能测试,我就在性能测试这个文件夹中找index.html
如想用JMeter查看测试报告,就直接把生成的jtl文件放到JMeter中的聚合报告中
