Jmeter常用组件的使用场景

一.在一段时间内持续发送请求


        此场景可以用于稳定性测试,在稳定性测试中,通常需要持续压测几个小时甚至几天时间,查看接口是否有报错,或者cpu、内存会上涨,此时就需要通过控制持续时间来达到此目的。

1.创建线程组,循环次数勾选永远

2.勾选调度器,持续时间输入120,即可在120秒内持续调用接口

二.每秒钟固定调用次数


如果想控制每秒发送请求数量,仅仅通过线程数与循环次数是不够的,因为这只能控制发送总数,而要控制每秒发送数量,需要线程数与常数吞吐量控制器的搭配使用,这种场景在性能测试中使用不多。

例如每秒钟调用30次接口,那么把线程数设置为30,将常数吞吐量控制器的每分钟样本量设置为60,即每个线程每秒钟调用一次,通过此设置可以控制每秒钟的调用次数。

三.数据库操作


Jmeter不仅可以作为性能测试工具和接口自动化工具,也可以作为日常数据库操作的工具。如果想循环多次操作数据库,例如插入多条数据,不需要写java或者python代码,仅仅通过Jmeter添加几个插件就可以实现了。

1.先在测试计划中配置数据库连接中间件,以mysql5.7为例,下载mysql-connector,如果是mysql8+,还请网上自行下载对应connector。

然后配置到Jmeter的测试计划中。

2.创建线程组和JDBC Connection Configuration,然后配置变量名称

3.在下面的Database Connection Configuration中配置数据库url、driver、name、password

4.创建JDBC Request,变量名称与上一步的变量名称一致,下方输入sql语句,执行即可

5.如果数据的某个字段需要随机生成,可以配合工具->函数助手来完成

四.将响应结果提取并写入csv


有时在进行性能测试时,需要将上一个接口的响应结果进行持久化保存,从而作为下一个接口的参数进行性能压测。创建线程组和HTTP请求,请求的响应结果中包含currentUserId这个字段,假定要提取这个字段

1.配置正则表达式提取器,每个字段的含义可查看此文章:https://zhuanlan.zhihu.com/p/27999878

2.配置BeanShell PostProcessor,参数与正则表达式中的引用名称一致,用${}进行引用,脚本如下:

FileWriter fw = new FileWriter("D:\\account1.csv",true);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(vars.get("param"));
bw.newLine();
bw.close();

五.线程组内参数传递


实现参数传递是做接口自动化的前提之一,而Jmeter可以实现参数提取与参数传递,例子中创建了两个HTTP请求,新闻列表请求会返回新闻列表uniquekey

而新闻详情请求的参数需要通过uniquekey,来返回详情内容。

1.在新闻列表的请求中增加JSON提取器,JSON Path expressions输入JsonPath表达式,定位到要提取的字段,然后赋值给变量“name”。

2.在新闻详情的请求中通过${}的形式,提取上一个接口的变量,注意此处变量用的是“name”

六.跨线程组参数传递


性能测试中,两个相关联的接口不一定都在同一个线程组,遇见这种情况时,我们要进行跨线程组传参,与上一个示例基本相同,只不过在第一个线程组中使用了BeanShell后置处理器,将参数保存到了全局变量。此处还是用新闻列表和新闻详情两个请求举例,只不过这次将两个请求分别放入不同的线程组。

1.新闻列表请求中配置BeanShell后置处理器,将“name”变量保存到全局变量中,并重新叫做“NAME”

${__setProperty(NAME,${name},)}


2.新闻详情请求中使用下面这种方式提取全局变量

${__property(NAME,,)}


3.如果失败,记得查看测试计划里是否勾选独立运行每个线程组,勾选后才生效

七.吞吐量控制器


在进行混合负载测试时,需要按照线上实际的流量,添加多个接口进行测试,此时就需要使用吞吐量控制器来进行流量的分配。例如将三个接口按照30%、50%、20%的比例进行分配,持续调用一段时间后,最终调用三个接口调用的样本数为:3:5:2

1.在每个接口上增加吞吐量控制器,注意吞吐量不要加百分号

2.持续调用20秒,查看聚合报告,样本数量基本保持3:5:2

八.id自增控制器


使用jmeter调用接口或者往数据库插入数据时,经常遇见id不能重复的情况,此时可以通过计数器来完成。

1.添加计数器控制元件,输入起始值、步长和引用名称

2.接口调用时使用${}引用计数器的引用名称即可实现变化

参考链接:https://blog.csdn.net/shuijiaxiaowei/article/details/127867973

 1. 通用关键字

可参考官方文档:

Write Testcase - HttpRunner V3.x Docs

2. 特别关键字

2.1. 步骤step前置

2.1.1. setup_hook

关键源码

    def setup_hook(self, hook: Text, assign_var_name: Text = None) -> "RunRequest":
        if assign_var_name:
            self.__step.setup_hooks.append({assign_var_name: hook})
        else:
            self.__step.setup_hooks.append(hook)

        return self

2.2. 步骤step后置

2.2.1. teardown_hook

关键源码

    def teardown_hook(
        self, hook: Text, assign_var_name: Text = None
    ) -> "RequestWithOptionalArgs":
        if assign_var_name:
            self.__step.teardown_hooks.append({assign_var_name: hook})
        else:
            self.__step.teardown_hooks.append(hook)

        return self

2.3. 重试

2.3.1. with_retry

关键源码

    def with_retry(self, retry_times, retry_interval) -> "RunRequest":
        self.__step.retry_times = retry_times
        self.__step.retry_interval = retry_interval
        return self

2.4.

3. demo

示例:

3.1. .setup_hook('${setup_hooks_request($request)}')

3.2. .teardown_hook('${teardown_assert_response($response)}')

teststeps = [
        Step(
            RunRequest('login')
            .with_variables(**{'token_length': 32, 'status_code': 201, 'status': 1})
            .setup_hook('${setup_hooks_request($request)}')
            .post('/client/user/auth')
            .with_headers(**{"Content-Type": "application/json"})
            .with_json({"scenario": "client", "company_id": '$company_id',
                        "user_name": "$username", "password": "$password",
                        "device_type": "$device_type", "device": ""})
            .teardown_hook('${teardown_assert_response($response)}')
            .extract()
            .with_jmespath("body.data.token", "token")
            .validate()
            .assert_equal('status_code', '$status_code', '断言失败')
            .assert_equal('body.status', '$status', '断言失败')
            .assert_length_equal('body.data.token', '$token_length', '断言失败')
        )
    ]

愿意同Joker一起探索测试之路,可以关注公众号交流。

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Anthony_路人甲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值