前言
在上两文中介绍了安装和入门使用,本文我们来看看 Taurus 一些进阶的玩法。
复杂场景统一测试
复杂场景的压力测试,如果有多个同学从事脚本开发,则有时必须使用多个测试脚本文件。这意味着将多个测试脚本需要集成到单个压力测试中。在 JMeter 中可以通过使用 TestFragments
功能部分解决,但是它需要手动管理主测试模块才能添加测试片段,将其排列到线程组中,计算压力场景等。
下面将介绍 Taurus 运行 JMeter 测试,从 YAML 设置和覆盖 JMeter 测试的某些测试参数,以及使用多个 YAML 文件构建统一的单个测试的各种场景。
多个JMeter JMX测试
这里我演示三个 JMeter 示例脚本:
- build-ftp-test-plan.jmx
- build-webservice-test-plan
- jmx build-web-test-plan.jmx
运行多个 JMeter JMX 测试就将路径传递到 bzt 命令即可,如下所示:
bzt build-ftp-test-plan.jmx build-webservice-test-plan.jmx build-web-test-plan.jmx
终端中显示实时测试状态:
测试后的摘要统计信息:
Taurus 自动获取 JMeter JMX 脚本并同时执行它们,同时 Taurus 为每个 JMeter 测试脚本生成了一组额外的结果:
文件说明:
- modified_xxxx.jmx:注入了结果编写器的实际 JMX 文件
- kpi.jtl:主要结果文件(CSV)
- errors.jtl:包含有关错误的全面信息(XML)
- jmeter.log:JMeter引擎日志文件
- 等等
通过 Taurus 执行的每个 JMeter 脚本都有其自己的结果集。这里结果查看可以使用 MergeResults
插件,该插件可以根据提供的文件的 .jtl 结果绘制区分的图或合并的图。
具体参考:https://jmeter-plugins.org/wiki/MergeResults/
效果示图:
YAML 配置文件
Taurus 还支持从 YAML 文件运行多个现有的 JMeter JMX 测试脚本。
这里演示 Taurus 使用 2 个 Scenario 同时启动两个(或多个)JMeter JMX 测试:
编写 exist_multiple_jmx_conifg.yml
:
1. settings: # 环境变量设置
2. env:
3. BASE_DIR: /home/taurus/taurus_container_scripts # 脚本目录
4. artifacts-dir: /home/taurus/taurus_container_artifacts/simple1/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - scenario: simple1 # 场景1名称
8. - scenario: simple1 # 场景2名称
9.
10. scenarios:
11. simple1:
12. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本1
13. simple2:
14. script: '${BASE_DIR}/build-ftp-test-plan.jmx' # 脚本2
15.
16. modules:
17. jmeter:
18. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
19. version: 5.2.1 # 版本号
20.
21. reporting:
22. - module: final-stats # 摘要报告
23. - module: console # 控制台
执行命令:
1. bzt exist_multiple_jmx_conifg.yml
Taurus Console 显示两个测试当前正在并行执行:
测试后的摘要统计信息:
覆盖JMeter测试参数
上面介绍了使用 Taurus 执行现有 JMeter 脚本测试的过程,现在让我们更深入地了解如何从 YAML 配置文件控制和覆盖 JMeter 测试参数设置。
单线程组
我们通过修改脚本一次通过一个线程访问:
现在让我们通过 YAML 配置文件来运行它:
- 运行现有的 .jmx 脚本
- 设置以下加载方式:
- 并发:10个线程
- 启动时间:1分钟
- 持续时间:2分30秒
编写 cover_exist_jmx_conifg.yml
:
1. settings:
2. env:
3. BASE_DIR: /home/taurus/taurus_container_scripts # 脚本目录
4. artifacts-dir: /home/taurus/taurus_container_artifacts/simple1/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - concurrency: 10 #并发线程数
8. ramp-up: 1m # 启动时间
9. hold-for: 2m30s # 持续时间
10. scenario: simple1 # 场景名称
11.
12. scenarios:
13. simple1:
14. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本
15.
16. modules:
17. jmeter:
18. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
19. version: 5.2.1 # 版本号
20.
21. reporting:
22. - module: final-stats # 摘要报告
23. - module: console # 控制台
注意:
- 并发是线程数(并发用户);它用于10个线程,而不是每秒10个请求;
- 测试持续时间 -是启动值和持续值的总和,因此10秒后,如果所有10个线程均会启动,则10个线程将启动1分钟(从1个线程开始,每6秒再增加1个)。在正常运行的情况下,测试将继续进行2分钟30秒。总测试时间为
1m+2m30s=3分钟30秒
。
用在 JMeter GUI 中打开生成的 .jmx 文件的 Taurus 命令如下:
1. bzt cover_exist_jmx_conifg.yml -gui
如上图所示,修改了 “Number of Threads”, “Ramp-Up” 和 “Loop Count” 的参数值,根据 YAML 文件设置了测试持续时间,并添加了2个监听器以存储测试指标以及有关错误的详细信息。
除了这些基准更改之外,还可以:
- 添加(或覆盖)任何属性(包括 JMeter 属性和系统属性);
- 添加(或覆盖)用户自定义变量;
- 启用/禁用从线程组开始并以监听器结束的任何测试元素;
- 修改任何测试元素值;
- 等等
多线程组
我们看到 Taurus 能够修改基准线程组参数(以及其他测试属性)。但是,如果我们在 JMeter 测试计划中有多个线程组怎么办?
我们使用上例相同的 YAML 文件,以及几乎相同的 .jmx 脚本,让我们添加第二个线程组,复制现有的线程组并将其粘贴到下面:
让我们再次运行 Taurus,并选择它显示生成文件的JMeter gui:
1. bzt cover_exist_jmx_conifg.yml -gui
如图所示,第一个线程组的线程数现在减少到 5,这是由于Taurus修改了。Taurus 可以计算并发并将其平均分配到现有的(启用的)线程组中。第二个线程组也有5个线程数。注意不考虑禁用线程组,而是将其保留在生成的 .jmx 测试脚本中。Taurus不会修改 setUp 和 tearDown 线程组。
多个线程组和不同线程数
Taurus 如何处理多个线程组具有不同线程号的情况。
比如:使用下面 JMeter 测试计划结构:
- 测试计划
- 线程组1-5个并发线程数
- 线程组2-10个并发线程数
还有一个Taurus YAML配置文件,其中包含:
- 并发:30
产生的压力测试配置将如下所示:
- 测试计划
- 线程组1-10个并发线程数
- 线程组2-20个并发线程数
Taurus 将配置的并发数按比例分配在2个线程组之间,并保持原始场景压力比例。
多个JMeter JMX测试脚本
可以从 YAML 文件中覆盖多个 JMeter 测试脚本的执行参数。但是,必须分别为每个 .jmx 文件设置执行参数。先前描述的行为(Taurus 将在 .jmx 文件中的已启用线程组之间分配已定义的并发数)仍然存在。
相关配置可执行2个并行提供的 JMeter .jmx 脚本,并根据我们配置(10个线程,1分钟启动时间,2分半钟)覆盖线程数配置,如下所示:
1. settings:
2. env:
3. BASE_DIR: /home/taurus/taurus_container_scripts # 脚本目录
4. artifacts-dir: /home/taurus/taurus_container_artifacts/simple/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - concurrency: 10 #并发线程数
8. ramp-up: 1m # 启动时间
9. hold-for: 2m30s # 持续时间
10. scenario: simple1 # 场景名称
11. - concurrency: 10 #并发线程数
12. ramp-up: 1m # 启动时间
13. hold-for: 2m30s # 持续时间
14. scenario: simple2 # 场景名称
15.
16. scenarios:
17. simple1:
18. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本
19. simple2:
20. script: '${BASE_DIR}/build-ftp-test-plan.jmx' # 脚本
21.
22. modules:
23. jmeter:
24. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
25. version: 5.2.1 # 版本号
26.
27. reporting:
28. - module: final-stats # 摘要报告
29. - module: console # 控制台
让我们再次运行 Taurus,并选择它显示生成文件的JMeter gui:
1. bzt cover_multiple_threadgroup_exist_jmx_conifg.yml -gui
控制测试中的TPS
长时间来 JMeter 用户必须不断尝试测试,找到确切的线程数和计时器延迟,以产生期望的TPS,并且认为时间可能很耗时并且并不总是准确的而JMeter提供了 ConstantThroughputTimer
和 ThroughputShapingTimer
。
而 Taurus 构建固定 TPS 场景非常简单,能够为压测测试脚本精确设置所需的TPS。
让我们从一个非常简单的示例场景开始,一个10用户压测,启动时间为1分钟,测试持续时间为2分钟30秒。相关的 Taurus YAML 配置文件为:
cover_exist_jmx_conifg_win.yml
:
1. settings:
2. env:
3. BASE_DIR: E:\Taurus # 脚本目录
4. artifacts-dir: E:\Taurus\artifacts\simple1\%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - concurrency: 10 #并发线程数
8. ramp-up: 1m # 启动时间
9. hold-for: 2m30s # 持续时间
10. scenario: simple1 # 场景名称
11.
12. scenarios:
13. simple1:
14. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本
15.
16. modules:
17. jmeter:
18. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
19. version: 5.2.1 # 版本号
20.
21. reporting:
22. - module: final-stats # 摘要报告
23. - module: console # 控制台
通过 Taurus 运行:
在我们的案例中可以看到,TPS 平均为 10 左右,让我们通过 Taurus 将其 TPS 限制为5:
编写 cover_exist_jmx_conifg_limit_tps.yml
:
1. settings:
2. env:
3. BASE_DIR: E:\Taurus # 脚本目录
4. artifacts-dir: E:\Taurus\artifacts\simple1\%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - concurrency: 10 #并发线程数
8. throughput: 5 # 限制TPS
9. ramp-up: 1m # 启动时间
10. hold-for: 2m30s # 持续时间
11. scenario: simple1 # 场景名称
12.
13. scenarios:
14. simple1:
15. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本
16.
17. modules:
18. jmeter:
19. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
20. version: 5.2.1 # 版本号
21.
22. reporting:
23. - module: final-stats # 摘要报告
24. - module: console # 控制台
重新启动测试后,我们可以看到 TPS 受到限制,并在1分钟的启动时间内 TPS 负载逐渐增加到 5。
我们在JMeter GUI中以下方式打开此测试脚本:
1. bzt cover_exist_jmx_conifg_limit_tps.yml -gui
我们将看到 ThroughputShapingTimer
已添加到测试计划中,并且其配置与启动周期和目标 TPS 相匹配。
我们已经注意到 TPS 是通过两个步骤添加的:
- 在60秒内将负载从1 TPS 增加到 5 TPS(启动)
- 将负载以5 TPS的速度保持150秒(保持)
我们也可以使用 Taurus 中的 steps 参数来控制所需的步骤数。因此,如果我稍微修改测试并添加 5个步骤,如下所示:
1. settings:
2. env:
3. BASE_DIR: E:\Taurus # 脚本目录
4. artifacts-dir: E:\Taurus\artifacts\simple1\%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f
5.
6. execution:
7. - concurrency: 10 #并发线程数
8. throughput: 5 # 限制TPS
9. steps: 5 # 阶梯
10. ramp-up: 1m # 启动时间
11. hold-for: 2m30s # 持续时间
12. scenario: simple1 # 场景名称
13.
14. scenarios:
15. simple1:
16. script: '${BASE_DIR}/build-web-test-plan.jmx' # 脚本
17.
18. modules:
19. jmeter:
20. download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下载地址
21. version: 5.2.1 # 版本号
22.
23. reporting:
24. - module: final-stats # 摘要报告
25. - module: console # 控制台
然后,将导致以下 ThroughputShapingTimer
配置:
因此,只需要设置步数,Taurus 就会在定义的加速期内自动按比例分配目标TPS。
小结
本文我们介绍了几种复杂场景的使用方法 ,其中包括:
- 复杂场景统一测试
- 多个JMeter JMX测试;
- YAML 配置文件;
- 覆盖JMeter测试参数
单线程组;
多线程组;
多个线程组和不同线程数;
多个JMeter JMX测试脚本;
控制测试中的TPS
总结其核心思想,就是我们可以使用 YAML 来统一描述性能测试,这就是我们想要的 test as code。
示例脚本:
https://github.com/7DGroup/JMeter-examples/tree/master/taurus