1、背景

最近在技术群里面讨论到使用 python 操作 jmeter 的话题

有人提到了 subprocess 启动命令行来操作 jmeter,也有人提到了 jmeterapi,另外也有人提到了 pymeter

除了这些,实际上我之前也基于 docker+subprocess 来操作 jmeter 的项目

jmeterapi 这个库年久失修,就不想搞它了,下面跟我一起试试 pymeter 吧

image.png

image.png

2、环境准备

直接参考项目的说明即可
image.png

3、Jmeter 测试

3.1 写测试用例

使用方法比较简单,设置 GUI 类似,只是前后顺序不相同:

# 省略 import

class TestTestPlanClass(TestCase):
    def test_1(self: Any) -> None:
        # 创建一个JsonExtractor对象,参数分别是"variable"和"args.var"
        json_extractor: JsonExtractor = JsonExtractor("variable", "args.var")

        # 创建一个均匀随机计时器,时间间隔在1000至2000毫秒之间
        timer: UniformRandomTimer = UniformRandomTimer(1000, 2000)

        ra: ResponseAssertion = ResponseAssertion.contains_substrings("var")
        # 创建一个HttpSampler对象,用于发送HTTP请求并记录响应
        http_sampler: HttpSampler = HttpSampler(
            "Echo",
            "http://119.91.147.215:18080/get?var=${__Random(0,10)}",
            timer,
            json_extractor,
            ra,
        )

        # 创建一个DummySampler对象,仅用于模拟一些操作,不实际执行任何网络请求
        dummy_sampler: DummySampler = DummySampler("dummy ${variable}", "hi dummy")

        # 创建一个线程组,其中包含10个线程,每个线程的运行时间为1秒,整个线程组的持续时间为60秒
        tg: ThreadGroupWithRampUpAndHold = ThreadGroupWithRampUpAndHold(
            100, 3, 60, http_sampler, dummy_sampler, name="Some Name"
        )

        # 创建一个HTML报告生成器
        html_reporter: HtmlReporter = HtmlReporter()

        # 创建一个测试计划,其中包含tg线程组和html_reporter报告生成器
        tp: TestPlan = TestPlan(tg, html_reporter)

        # 运行测试计划,返回统计数据
        stats = tp.run()

        # 打印测试的统计數據
        print(
            f"duration= {stats.duration_milliseconds}",
            f"mean= {stats.sample_time_mean_milliseconds}",
            f"min= {stats.sample_time_min_milliseconds}",
            f"median= {stats.sample_time_median_milliseconds}",
            f"90p= {stats.sample_time_90_percentile_milliseconds}",
            f"95p= {stats.sample_time_95_percentile_milliseconds}",
            f"99p= {stats.sample_time_99_percentile_milliseconds}",
            f"max= {stats.sample_time_max_milliseconds}",
            sep="\t",
        )

        # 断言99%分位数的样本时间小于2000毫秒
        self.assertLess(stats.sample_time_99_percentile_milliseconds, 30)

3.2 运行和收集结果

3.2.1 pycharm 启动

如果你使用的 PyCharm,会自动识别

image.png

3.2.2 命令行启动

# rikasai @ huacai-mbp in ~/code/python/pymeter-demo [22:23:38] C:1
$ python main.py
 +    579 in 00:00:07 =   86.2/s Avg:   139 Min:     9 Max:   500 Err:     0 (0.00%) Active: 100 Started: 100 Finished: 0
 +   3964 in 00:00:30 =  131.9/s Avg:   142 Min:     8 Max:   500 Err:     0 (0.00%) Active: 100 Started: 100 Finished: 0
 =   4543 in 00:00:37 =  123.6/s Avg:   142 Min:     8 Max:   500 Err:     0 (0.00%)
duration= 64265 mean= 144       min= 8  median= 54      90p= 404        95p= 451        99p= 491        max= 500
F +      7 in 00:00:03 =    2.1/s Avg:   864 Min:   225 Max:   977 Err:     0 (0.00%) Active: 6 Started: 6 Finished: 0
duration= 14276 mean= 323       min= 223        median= 230     90p= 960        95p= 973        99p= 1012       max= 1207
.
======================================================================
FAIL: test_1 (__main__.TestTestPlanClass)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/rikasai/code/python/pymeter-demo/main.py", line 67, in test_1
    self.assertLess(stats.sample_time_99_percentile_milliseconds, 30)
AssertionError: 491 not less than 30

----------------------------------------------------------------------
Ran 2 tests in 79.631s

FAILED (failures=1)
(pymeter-demo) 

需要注意的是,这里断言失败,是 unittest 断言失败,这个数据并不会在 jmeter 报告中体现

3.2.3 查看报告

报告会自动生成在 output 文件夹下面,一个 test 函数对应一份报告

使用浏览器打开 index.html 就能看到完整的报告

image.png

image.png

image.png

image.png

4、总结

5、参考链接:


↙↙↙阅读原文可查看相关链接,并与作者交流