参考 jmeter 官网,笔者使用的是 5.3 版本。
基本操作
jmeter 界面打开后,会初始化一个名为 Test Plan 的测试计划:
测试计划下面可以添加多个线程组:
线程组下可以添加多个 HTTP 请求:
HTTP 请求下可以添加查看结果树监听器:
至此,我们就有了一个测试计划最基础的元件,接下来配置请求的具体信息:
Figure 1. 请求百度首页
简单做个测试,请求百度首页。执行请求后,查看响应结果:
至此,我们就完成了一个最简单的请求。
为了方便学习,可以检出 https://github.com/peacetrue/learn-jmeter 资源库,里面有一些具体的测试计划文件(后缀为 jmx),可以直接导入后运行:
Figure 2. 测试计划-步骤1
Figure 3. 测试计划-步骤2
定位 jmeter.properties
jmeter.properties 是 jmeter 的配置文件,接下来有些操作会涉及到修改配置信息,所以提前找好 jmeter.properties 的位置:
代码语言:javascript复制$ find /usr/local -name jmeter.properties
/usr/local/Cellar/jmeter/5.3/libexec/bin/jmeter.properties
响应乱码
默认情况下,返回数据的编码格式为 ISO-8859-1,这会导致返回数据出现乱码:
需要将编码格式改为 UTF-8。打开 jmeter.properties 配置文件,找到配置项 sampleresult.default.encoding,修改其值为 UTF-8:
改完之后,重新打开 jmeter 界面,再次执行请求,可以看到返回数据正常了:
登陆后执行操作
创建一个线程组,添加一个 Cookie 管理器,添加一个登陆请求,然后再添加其他依赖登陆的请求:
最后运行该线程组,这样登陆请求成功后,其他请求也都是经过身份认证的:
Figure 4. 登陆成功
Figure 5. 登陆后请求成功
在一个线程组内,请求是顺序执行的,Cookie 管理器会在请求之间传递 cookie,类似于在浏览器中运行。
如果有多个线程组,每个线程组都添加一个登陆请求,会很繁琐,有没有更好的办法呢?
登陆后手动设置会话 Cookie
创建一个测试计划(或者导入资源库中已经提供的测试计划):
单独运行登陆线程组:
查看返回的 Cookie 信息:
手动添加到 Cookie 管理器中:
这样单独运行【依赖登陆的线程组1】和【依赖登陆的线程组2】都能通过认证。
手动设置会话 Cookie 也有些麻烦,有没有方法可以自动设置会话 Cookie 呢?
登陆后自动设置会话 Cookie
首先,启用 cookie 缓存为变量,打开 jmeter.properties 文件,找到 #CookieManager.save.cookies=false, 取消该行注释,修改值为 true:
这样可以通过变量(COOKIE_{名称})取得 cookie 值。
基于 登陆后手动设置会话 Cookie 进行修改,在登陆请求下添加后置处理器:
然后,编写后置处理器的脚本内容:
代码语言:javascript复制String session = vars.get("COOKIE_SESSION"); //<1>
props.put("session",session); //<2>
1 | 从变量集合中取出会话 cookie 值 |
---|---|
2 | 将会话 cookie 值存储到属性集合中 |
为什么要将 cookie 值,从变量集合转存到属性集合呢,因为变量只能在线程内使用,跨线程变量无法共享,但属性可以持久化,也能跨线程共享。
最后,在 Cookie 管理器中添加会话 Cookie:
会话 Cookie 名为 SESSION,会话 Cookie 值为 ${__property(session)},即获取 session 属性的值,之前我们已经在后置处理器中设置过 session 属性值了。
至此就完成了所有配置,接下来查看运行效果。首先,单独运行【登陆线程组】;然后禁用【登陆线程组】,最后运行所有线程组。
负载测试
当启动 jmeter 时,jmeter 会在客户端提示:
代码语言:javascript复制$ jmeter
================================================================================
Don't use GUI mode for load testing !, only for Test creation and Test debugging.
For load testing, use CLI Mode (was NON GUI):
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
& increase Java Heap to meet your test requirements:
Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file
Check : https://jmeter.apache.org/usermanual/best-practices.html
================================================================================
不要使用界面模式做负载测试,界面模式只用于测试创建和调试测试。负载测试需要使用命令行模式。
做负载测试时,我们可以通过界面模式调整参数,但不要通过界面模式直接运行,要使用命令行模式。参考之前【登陆后自动设置会话 Cookie】所描述的,运用于命令行模式会有问题。通过界面模式登陆后,再使用命令行模式执行其他请求,此时会提示尚未登陆。
这里我们需要使用【登陆后手动设置会话 Cookie】,通过界面模式登陆后,取得会话 Cookie,然后存储在 Cookie 管理器中:
直接基于 ${__property(session)}
,添加一个默认值 ${__property(session,,e0efbaaa-dbba-41b2-b260-76723650381c)}
,这样界面模式和命令行模式都可以使用。
本文源码位于 https://github.com/peacetrue/learn-jmeter