通过参数化可以实现单个接口的功能测试,而接口测试过程中,除了单个接口的功能测试之外,还会测试接口业务实现,所谓业务,就是一套完整的业务逻辑或流程,这就必须要使用到逻辑控制和关联。
需求1:测试计划中定义一个 http 请求访问传智播客官网,但是该请求不是无条件执行的,声明一个用户定义的变量,如果变量是 itcast 才执行,否则就不执行
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量
2、核心:添加 if 控制器,子级添加取样器 (和之前实现不同,控制器和取样器存在父子级关系)
添加-逻辑控制器-如果(if)控制器
注意这里不勾选Interpret Condition as Variable Expression
输入如下:截图里截错了哈,应该是itcast
"${myComp}" == "itcast"
添加Http请求如下:
如果要让逻辑控制器生效,必须拖拽Http请求为逻辑控制器的子集
创建用户自定义变量
myComp itcast
查看结果树
如果条件不满足的话,会发现查看结果树中是没有内容的
比如这里我更改一下IF控制器中的内容
点击运行,可以看到请求不会执行
需求2:有一组关键字 [hello,python,测试] (使用用户定义的变量存储)要依次取出,并在百度搜索
1、搭框架,测试计划,线程组,结果树,声明一个用户定义的变量,存储一组数据
2、添加 forEach 控制器,子级添加取样器 (和之前实现不同,控制器和取样器存在父子级关系)
3、百度搜索关键字
添加-逻辑控制器-ForEach控制器
注意:HTTP请求必须是ForEach的子集
添加-配置元件-用户定义的变量如下:
配置ForEach控制器
这里name是变量name_1、name_2、name_3的前缀
0:不包含的循环开始字段
3:包含的循环结束字段
array:每一次循环变量的名称
查看结果树如下:
注意线程组中的循环次数是1即可
需求3:循环访问学生管理系统10次
实现:
1、搭框架,测试计划,线程组,结果树
2、添加循环控制器,子级添加取样器 (和之前实现不同,控制器和取样器存在父子级关系)
创建HTTP请求如下
拷贝一下HTTP请求,分别起名HTTP请求1和HTTP请求2
添加-逻辑取样器-循环控制器
循环次数为5,并且创建2个循环控制器,分别操作一个HTTP请求
查看结果树如下:
关联: 上一个请求的响应结果和下一个请求的数据有关系。
需求1:两个http请求,请求A访问传智播客官网,请求B访问百度 ,请求A将传智播客官网源码中的 title 标签的值取出,传递给请求B,在请求B中作为关键字搜索这个title值
步骤:
1、搭框架,编写两个请求,传智播客 + 百度搜索
2、核心: 取出传智播客页面源码的 title 值
3、传递给百度:${变量名} 的方式传值
先新建一个HTTP请求,访问传智播客的官网
添加一个查看结果树,从返回结果,我们可以看到Response Body中有标签title
那如何提取标签title呢,我们采用提取器
添加-后置处理器-Xpath提取器
编辑如下
匹配数字:-1代表所有,1代表第一个,这里取1即可
配置HTTP请求访问百度,之前访问都会有百度安全验证,原因是没有勾选这个“与浏览器兼容的头”,勾选后就可以访问了
查看结果树如下:正确提取到了传智教育
需求:两个请求,请时求A查询所有学院信息,请求B访问百度,从请求A中提取出第一个学院的学院名称,把名称放在百度上搜索
步骤:
1、搭框架,编写两个请求,查询所有学院信息 + 百度搜索
2、核心:从学院查询中提取学院名称
3、传递给百度,调用格式: ${变量名}
添加HTTP请求,获取所有学院的名称
可以先看一下查询结果,是一个json的字符串,我们要提取dep_name后面的value的值
添加-后置处理器-正则表达式提取器
配置如下:这里的?是终止贪婪模式,如果不写?会一直匹配到最后
添加http请求查询百度,这里的val是正则表达式的变量名
查看结果树如下:
建议: 如果从标签文档提取数据建议使用 XPath 提取器,如果从非标签文档提取数据建议使用正则表达式提取器
变量作用域局限于当前线程组,其他线程组不可以直接调用。可以将请求A中提取的结果导出到公共空间(可以被不同线程组共享),请求B再从公开空间调用该变量,相当于全局变量。
步骤:
1、将请求A的数据导出到公共空间( __setProperty)
2、把代码放在beanshell取样器中
3、请求B从公共空间调用数据 (__property)
我们继续采用上面的例子,先建立一个线程组1,新建一个HTTP请求,获取itcast的html标签
建立子XPath提取器,提取title标签
再建立一个线程,新建HTTP请求访问百度,采用XPath中提取的title的值
配置执行计划是顺序执行,保证先运行线程组1
调用查看结果树,发现线程组2获取不到结果,根据提示可以看到val这个变量是没有申明的局部变量,只能在线程组1中使用
首先我们要设置一个全局变量,点击函数助手
函数助手配置如下,点击生成,复制内容
${__setProperty(out,${val},)}
添加-取样器-BeanShell取样器
把刚才生成的内容拷贝过来即可完成设置全局变量
接着我们获取全局变量,点击函数助手
配置如下:拷贝生成的内容
放到百度查询的内容
运行后查看结果树:
虽然是一长串字母,我们可以在浏览器中打开,没问题
模拟各种正常的、峰值的测试环境,检测程序的各项性能指标是否能够达标
JMeter 中内置了 定时器,可以实现时间模式相关的性能测试
需求1:同一时刻 100 个同学去访问学生管理系统的查询所有学院信息功能,统计高并发情况下平均响应时间以及错误率(高并发)
1、搭框架,测试计划,线程组,取样器,结果树(局限性),指定线程组的线程数属性值为 100
2、添加定时器 synchronizing timer(集合点组件)
3、运行并查看结果查看:聚合报告组件,可以对结果汇总分析
添加-定时器-Scynchronizing Timer
模拟用户组的数量,按照100来
这里注意超时时间不要设置0,不要让程序卡死
集合点组件使用时,当用户总数不能整除一组用户数时,可能会导致程序挂起,所以要设置0
需求2:一个用户以 20QPS ( == 20 次/s,QPS是每秒钟的查询次数) 的频率访问学生管理系统服务器,持续15秒,统计服务器的平均响应时间
QPS: Query per Seconds 每秒查询数(查询率),每秒访问多少次服务器
1、搭框架,测试计划,线程组,取样器,聚合报告,根据题干计算数据:
循环次数 = 访问频率 * 持续时间
2、添加QPS访问频率控制的相关组件:
每分钟访问次数 = 访问频率 * 60
添加-定时器-Constant Throughput Timer
注意:这里目标吞吐量是按照分钟计算的,那我们20QPS是每秒查询20次,折合成一分钟就是20 * 60 = 1200,所以这里设置成1200
QPS = 20,持续15秒,我们可以算一下:
接口访问的频率 = QPS * 持续时间 = 20 * 15 = 300
查看聚合报告
多机台协作,以集群的方式完成测试任务,可以提高测试效率。
控制机 = 负责任务分配
执行机 = 负责任务实现
工作流程
1.控制机需要制定测试任务,并下发到执行机
2.执行机执行任务并将结果返回到控制机
3.控制机做结果汇总
环境搭建:
1、不同的测试机上安装 Jmeter
2、配置基础环境(统一操作系统、JDK、Jmeter … )
3、核心: 控制机如何与执行机通信? 关键点:端口号
4、控制机中设置执行机的 IP
%JMETER_HOME%/bin/jmeter.properties ----> remote_hosts=执行机A的IP:端口号, 执行机B的IP:端
口号, …
Remote Hosts - comma delimited
配置地址和端口号,逗号隔开
3-3、控制机和执行机都得设置远程访问相关属性:
server.rmi.ssl.disable=true
配置完成后要重启JMeter