Jmeter测试计划
测试计划
可以将测试计划可视化为用于运行测试的JMeter脚本。测试计划由测试元素组成,例如线程组,逻辑控制器,样本生成控制器,监听器,定时器,断言和配置元素。 每个测试计划中至少应有一个线程组。 我们可以根据要求添加或删除元素。 前言中的快速开始就是一个测试计划。
当你执行测试时,添加的所有所需组件和元件组成了一个有机整体,即一个完整的测试计划。这个测试计划反映了你对系统性能和功能的验证方式以及测试场景的设计。
测试计划控制面板中的元素:
-
名称和注释
-
用户定义的变量
-
独立运行每个线程组
-
主线程结束后运行tearDown线程组
-
函数测试模式
-
添加目录或jar包到classpath
用户定义的变量
当在测试计划的多个部分中存在重复的数值时,可以通过用户定义的变量
来提供更灵活的设置。
测试计划控制面板中的用户定义的变量
的作用域覆盖整个测试计划。
你可以通过${变量名称}
的方式来引用这些变量。这种方式允许你在不同的请求或操作中使用相同的数值,从而更加方便地维护和修改。
示例接口代码:
@TestPlan.route('/api/TestPlan1/', methods=['GET', 'POST'])
def testplan1():
if request.method != 'POST':
return "嘿!伙计,你的请求方式错了呀!"
data = request.get_json()
if "Variables" not in data:
return "嘿!伙计,你的请求参数错了呀!"
return "本次请求的用户定义的变量值是:" + data['Variables']
示例Jmeter脚本
-
测试计划面板中添加用户定义的变量
名称:
Variables
值随意输入:
比如:姜
-
测试计划下添加线程组
-
线程组下添加HTTP请求
请求地址:
HTTP://127.0.0.1:5000/api/TestPlan1/
请求方式:
POST
消息体数据:
{"Variables":"${Variables}"}
-
HTTP请求下添加HTTP信息头管理器(右键HTTP请求-添加-配置元件-HTTP信息头管理器,添加信息头,指定请求体类型)
名称:
Content-Type
值:
application/json
-
测试计划下添加查看结果树
演示内容
点击上方绿色三角,查看结果树
请求体中的数据为:{"Variables":"姜"}。说明成功调用可测试计划中用户定义的变量。
此外,JMeter提供的配置元件中也包含用户定义的变量
元件,通过测试计划/线程组/取样器-添加-配置元件-用户定义的变量
进行添加。用法与测试计划面板中的用户定义的变量
一致,不同之处在于作用域。
举例来说,在测试计划下添加的用户定义的变量
将在整个测试计划中生效,与测试计划面板中的用户定义的变量
作用范围一致。然而,如果用户定义的变量
位于取样器中,其作用范围将仅限于该特定取样器内。这种灵活性允许在不同配置元件中使用变量,使其作用范围更具体而有针对性。
建议使用更自由的配置元件中的用户定义的变量
。
独立运行每个线程组
当一个测试计划下有多个线程组时,且这些线程组都处于执行状态时,使用测试计划中的独立运行每个线程组
勾选框,可以使线程组按照顺序从上至下执行,以防止各个线程组之间相互影响。
示例接口代码
@TestPlan.route('/api/TestPlan2/', methods=['GET', 'POST'])
def testplan2():
sleep(3) # 接口设置了休眠三秒,即接口在接收到请求数据三秒后,返回响应数据。
return "响应时间:" + str(datetime.now())
示例Jmeter脚本
-
测试计划下添加两个线程组
名称:
线程组1
、线程组2
-
两个线程组下皆添加取样器
名称与对应线程组一致:
线程组1
、线程组2
请求地址:
HTTP://127.0.0.1:5000/api/TestPlan2/
请求方式:
GET
-
测试计划下添加查看结果树
演示内容
不勾选独立运行每个线程组
,运行结果
取样器结果中的Sample Start 是请求发出的时间。可以观察到两个线程组内的 HTTP 请求在同一时刻发出,即 2024-04-03 11:27:43
。因为两个线程组是并发、随机执行的。
此外需要多说一下。未勾选 独立运行每个线程组
时,线程组是并发执行。但线程组中的多个取样器并不会并发,而是在较短时间内发出全部请求,尤其是在取样器数量较多的情况下。
因此,在模拟高并发时,如果需要多线程组、所有取样器请求并发,建议在测试计划中添加同步定时器(Synchronizing Timer)
。
同步定时器(Synchronizing Timer)
可以确保在并发场景下的同一时间点触发多个线程组中多个取样器的请求,以更真实地模拟多用户同时访问系统的情况。
勾选独立运行每个线程组
,运行结果
取样器结果中的Sample Start 是请求发出的时间。可以观察到两个线程组内的 HTTP 请求并非在同一时刻发出,线程组2的请求发出时间是 2024-04-03 11:29:28
,线程组1的请求发出时间是 2024-04-03 11:29:31
。两者之间的时间差为3秒,正与接口休眠的三秒相符,这表明两个线程组是顺序执行的。
主线程结束后运行tearDown线程组
该选项主要适用于在取样器配置在取样器错误发生后要执行的动作
为停止测试
或立即停止测试
时,可能你需要无论取样器是否发生错误,都要执行tearDown线程组。
如果你对这个场景有需要,可以勾选主线程结束后运行tearDown线程组
。它的作用是即使普通线程由于取样器错误而导致线程结束执行时,Jmeter也会继续执行 tearDown 线程。
这意味着即使在测试中发生了错误,系统仍会在整个测试结束前执行 tearDown 线程,以确保在测试运行结束时执行一些清理或必要的操作。
需要注意的是,在 JMeter 中,普通线程组的执行优先级大于 tearDown 线程组,因此 tearDown 线程组将会等待所有普通线程组执行完毕后才会执行。
示例接口代码
@TestPlan.route('/api/TestPlan3/', methods=['GET', 'POST'])
def testplan3():
return {"code": 200}
示例Jmeter脚本*
-
测试计划下添加线程组、tearDown线程组
在取样器错误后要执行的动作
的选项勾选停止测试
或立即停止测试
-
线程组和tearDown线程组下添加http请求
名称:
线程组
,tearDown线程组
请求地址:
HTTP://127.0.0.1:5000/api/TestPlan3/
请求方式:
GET
-
线程组请求取样器下添加响应断言(右键取样器-添加-断言-响应断言)
添加、输入值:
1111
-
测试计划下添加查看结果树
响应断言用于匹配实际响应信息,作为验证接口响应的一种手段。例如,示例接口响应的是 {'code': 200}
,而添加的断言是 1111
,这两者无法匹配,即判断该取样器请求存在错误。
演示内容
不勾选主线程结束后运行tearDown线程组
,运行结果
因为响应体{"code": 200}
与断言1111
无法匹配,响应断言判断该取样器请求发生错误。未勾选主线程结束后运行tearDown线程组
时,不会执行 tearDown 线程组。
此时,修改响应断言为:{"code":200
,运行
这次因为响应体{"code": 200}
与断言{"code":200
匹配,响应断言判断该取样器请求正常,所以线程组被执行完毕后,执行 tearDown 线程组。
勾选主线程结束后运行tearDown线程组
,运行结果
响应断言还是:1111
,,运行
即使响应断言判断请求发生错误,因为了勾选主线程结束后运行tearDown线程组
,tearDown 线程组也会被执行。
函数测试模式
若选择了此选项,并且监听组件(比如“查看结果树”)配置了将结果保存到文件中,JMeter将每次的请求结果记录到文件中。值得注意的是,这种做法相对消耗资源,在负载测试中并不建议勾选。然而,在平时脚本调试的情况下,可以考虑启用该选项。
这样的设置主要适用于需要详细记录每次请求结果的情况,以便后续分析或排查问题。在负载测试中,由于可能生成大量的结果数据,将其全部保存到文件可能导致性能和资源开销的增加,因此需要谨慎使用。
实际应用场景相对有限,因此在本文中不进行详细演示。
添加目录或jar包到classpath
添加文件或 JAR 包功能主要用于调用外部的 JAR 包。当脚本需要引用外部的 Java 文件或 JAR 包时,可以通过将 JAR 包的路径添加到此功能中。这样,在 Beanshell 脚本中就可以通过 import 语句导入外部 JAR 包,并直接调用其中的方法。
这个特性提供了一种扩展 JMeter 功能的途径,使得用户可以方便地集成和调用外部 Java 类库,从而实现更复杂和灵活的测试脚本。
在后续的内容中,当涉及到 Beanshell 时,将详细阐述如何使用这一功能。
提示
本文示例接口源代码可从前言中下载。