JMeter 实战项目脚本录制最佳实践(含 BadBoy 录制方式)
一、项目背景
在软件测试过程中,使用 JMeter 进行性能测试和功能测试是常见的操作。本实战项目将详细介绍如何使用 JMeter 自带工具以及 BadBoy 进行脚本录制,并完善脚本以进行有效的压测。
二、JMeter 自带工具脚本录制流程
第一步:增加录制组件
打开 JMeter,在测试计划中右键点击,选择"添加" -> "非测试元件" -> "HTTP(S) Test Script Recorder"。这一组件是实现脚本录制的核心,它将作为代理服务器来捕获浏览器发送的请求。
第二步:设置代理(把 JMeter 作为代理)
- 获取 JMeter 所在机器的 IP 地址。在命令提示符中输入
ipconfig
命令,得到当前机器的 IP 地址,假设为192.168.0.17
。 - 打开"控制面板",找到"Internet 选项"。
- 在"Internet 选项"窗口中,切换到"连接"选项卡。
- 点击"局域网设置"按钮,在弹出的"局域网 (LAN) 设置"窗口中,勾选"为 LAN 使用代理服务器",并在"地址"栏中输入 JMeter 所在机器的 IP 地址
192.168.0.17
,在"端口"栏中输入 JMeter 代理服务器将要使用的端口号(后续在 JMeter 中配置)。
第三步:配置 JMeter 的代理服务器
- 回到 JMeter 的"HTTP(S) Test Script Recorder"界面。
- 在"端口"字段中设置一个未被占用的端口号,例如
8888
。 - 在"目标控制器"中选择一个线程组,录制的脚本将被添加到该线程组中。可以先创建一个新的线程组,例如命名为"录制线程组"。
- 可以根据需要配置"排除模式",用于排除一些不需要录制的请求,如静态资源(图片、CSS、JavaScript 文件等)的请求。常见的排除模式可以是
.*\.(jpg|jpeg|png|gif|css|js)
。
第四步:启动服务并且访问项目进行录制
- 在"HTTP(S) Test Script Recorder"界面点击"Start"按钮,启动 JMeter 代理服务器。
- 打开浏览器,访问要测试的项目。在浏览器中进行各种操作,如登录、浏览页面、提交表单等,JMeter 会自动捕获这些操作产生的请求,并将其添加到选择的线程组中。
三、使用 BadBoy 录制脚本流程
第一步:安装和启动 BadBoy
从官方渠道下载 link并安装 BadBoy 工具。安装完成后,启动 BadBoy。
第二步:开始录制
- 在 BadBoy 的地址栏中输入要测试项目的 URL,然后按回车键访问该网站。
- 点击 BadBoy 界面上的"Record"按钮,开始录制操作。
- 在浏览器窗口中进行各种操作,如点击链接、填写表单、提交数据等。BadBoy 会实时记录每一个操作步骤。
第三步:停止录制并保存脚本
- 完成所有需要录制的操作后,点击 BadBoy 界面上的"Stop"按钮,停止录制。
- 点击"File" -> "Save As",将录制的脚本保存为
.bbb
格式的文件。
第四步:将 BadBoy 脚本导入 JMeter
- 打开 JMeter,在测试计划中右键点击,选择"添加" -> "非测试元件" -> "BadBoy 录制的脚本导入器"。
- 在"BadBoy 录制的脚本导入器"界面中,点击"浏览"按钮,选择之前保存的
.bbb
格式的文件。 - 点击"导入"按钮,BadBoy 录制的脚本将被导入到 JMeter 中。
四、完善脚本
1. 调试接口直到完成
无论是使用 JMeter 自带工具还是 BadBoy 录制的脚本,录制完成后都需要检查线程组中的请求,删除一些不必要的请求(如之前排除模式未过滤掉的静态资源请求)。对每个请求进行调试,确保请求的参数、请求方法等设置正确。可以通过"查看结果树"监听器查看每个请求的详细信息,包括请求的 URL、请求头、请求参数和响应内容等。
2. 接口关联:正则,JSONPath
- 正则表达式提取器 :如果前一个接口的响应中包含后一个接口需要使用的数据,可以使用正则表达式提取器进行关联。例如,前一个接口的响应内容为
{"token": "abc123"}
,要提取token
的值,可以在该接口下添加"后置处理器" -> "正则表达式提取器",在"引用名称"中填写token
,"正则表达式"填写"token": "([^"]+)"
,"模板"填写$1$
,"匹配数字"填写1
。 - JSONPath 提取器 :对于 JSON 格式的响应,使用 JSONPath 提取器更为方便。例如,要提取上述 JSON 响应中的
token
值,可以在该接口下添加"后置处理器" -> "JSON 提取器",在"名称"中填写token
,"JSON 路径表达式"填写$.token
,"匹配数字"填写1
。在后续接口中,使用${token}
来引用提取的值。
3. 用【用户定义的变量】或【HTTP 请求默认值】提取 IP 或端口
- 用户定义的变量 :在测试计划中添加"配置元件" -> "用户定义的变量",在"名称"列中填写
server_ip
和server_port
,在"值"列中分别填写服务器的 IP 地址和端口号。在后续的 HTTP 请求中,使用${server_ip}
和${server_port}
来引用这些值。 - HTTP 请求默认值:在测试计划或线程组中添加"配置元件" -> "HTTP 请求默认值",在"服务器名称或 IP"字段中填写服务器的 IP 地址,在"端口号"字段中填写端口号。这样,后续的 HTTP 请求将默认使用这些值。
4. 需要对登录做 CSV 参数化处理:可以用少量的用户
-
创建一个 CSV 文件,例如
users.csv
,内容格式如下:username,password
user1,pass1
user2,pass2
user3,pass3 -
在登录接口所在的线程组中添加"配置元件" -> "CSV 数据文件设置"。
-
在"CSV 数据文件设置"界面中,"文件名"填写
users.csv
,"文件编码"选择合适的编码(如UTF-8
),"变量名称"填写username,password
。 -
在登录接口的请求参数中,使用
${username}
和${password}
来引用 CSV 文件中的数据。
5. 加聚合报告或者其他的报告
在测试计划中添加"监听器" -> "聚合报告",它可以统计每个请求的响应时间、吞吐量、错误率等信息。还可以根据需要添加其他监听器,如"图形结果"、"汇总报告"等,以更直观地展示测试结果。
6. 增加【事务控制器】(注意打勾),【仅一次控制器】,有可能要加【吞吐量控制器】
- 事务控制器:在需要统计一组请求的总响应时间和吞吐量的地方添加"逻辑控制器" -> "事务控制器",勾选"生成父样本"。例如,将登录和进入主页的请求放在一个事务控制器中,用于统计整个登录流程的性能指标。
- 仅一次控制器:在需要某个请求只执行一次的地方添加"逻辑控制器" -> "仅一次控制器"。例如,登录请求通常只需要执行一次,将登录请求放在仅一次控制器中。
- 吞吐量控制器:如果需要控制某个请求或一组请求的执行频率,可以添加"逻辑控制器" -> "吞吐量控制器"。设置"目标吞吐量"和"计算模式",以实现对吞吐量的精确控制。
五、增加断言
为了确保接口的响应符合预期,需要添加断言。例如,在登录接口中添加"响应断言",设置"要测试的响应字段"为"响应文本","模式匹配规则"为"包含","测试模式"为"登录成功"。这样,当登录接口的响应文本包含"登录成功"时,断言通过;否则,断言失败。
六、开始做压测:并发
为了模拟大量用户同时访问系统的情况,需要设置并发用户数。可以使用"同步定时器"来实现并发。
- 在需要并发执行的请求所在的线程组中添加"定时器" -> "同步定时器"。
- 在"同步定时器"界面中,设置"集合点数量"为要并发的用户数,例如
100
。当达到指定数量的线程到达集合点时,这些线程将同时释放,模拟并发访问。 - 调整线程组的"线程数"、"循环次数"和"Ramp - Up Period(秒)"等参数,以控制测试的规模和持续时间。例如,设置"线程数"为
100
,"循环次数"为10
,"Ramp - Up Period(秒)"为10
,表示在 10 秒内启动 100 个线程,每个线程循环执行 10 次请求。
通过以上步骤,可以完成一个完整的使用 JMeter 自带工具和 BadBoy 进行脚本录制、完善和压测的过程,对项目的性能和功能进行有效的测试。