JMeter 动态参数赋值实践

目录

前言

[单线程 + 用户参数](#单线程 + 用户参数)

场景说明

实战结果

配置明细

[单线程 + CSV Data Set Config](#单线程 + CSV Data Set Config)

场景说明

实践结果

配置明细

多线程循环单次执行

场景说明

实践结果

配置明细

[单线程 + 控制器 + 用户自定义变量 + 用户参数](#单线程 + 控制器 + 用户自定义变量 + 用户参数)

场景说明

实战结果

配置明细

[多并发 + 多接口 + 同步定时器](#多并发 + 多接口 + 同步定时器)

场景说明

实践结果

配置明细

总结


前言

日常接口测试/性能测试使用 jmeter 实现动态参数赋值,常规用法都是配置 csv 文件,然后接口直接从 csv 文件里面去获取,但是这种方式有一个弊端,就是脚本文件迁移的时候,必须一起带上 csv 才行,不然脚本位置变了,里面 csv 的文件路径没有同步更新,脚本执行就会受影响了。但是除去 csv 的方式,尤其是小数据量的情况下,是可以通过用户自定义变量或者用户参数来实现的,接下来使用他们来做演示,看各自不同组合配置产生的结果如何。

单线程 + 用户参数

场景说明

复制代码
测试计划 (顺序执行: true)
|
+-- 线程组 (并发用户数: 1, 循环次数: 10)
    |
    +-- 用户参数(user parameter)
      | 变量用户id对应的不同用户值: userId_1, ..., userId_n)
      | 每次迭代更新一次:false/true,结果一样
    |
    +-- HTTP 取样器 (调用接口,并在入参处引用 ${userId})
    |
    +-- HTTP 取样器 2(后续接口调用...)
    |
    ...
    |
    +-- HTTP 取样器 N (整个链路的最后一环)

实战结果

循环 10 次,每次的接口入参值都相同,且值为 userId_1

配置明细

单线程 + CSV Data Set Config

场景说明

复制代码
测试计划 (顺序执行: true)
|
+-- 线程组 (并发用户数: 1, 循环次数: 10)
    |
    +-- CSV Data Set Config(变量为 userId)
    |
    +-- HTTP 取样器 (调用接口,并在入参处引用 ${userId})
    |
    +-- HTTP 取样器 2(后续接口调用...)
    |
    ...
    |
    +-- HTTP 取样器 N (整个链路的最后一环)

实践结果

单线程 N 次循环 结合 CSV 外部参数化配置,可实现动态取参,且值不重复

配置明细

多线程循环单次执行

场景说明

复制代码
测试计划 (顺序执行: true)
|
+-- 线程组 (并发用户数: 10, 循环次数: 1)
    |
    +-- 用户参数(user parameter)
      | 变量用户id对应的不同用户值: userId_1, ..., userId_n)
      | 每次迭代更新一次:false/true,结果一样
    |
    +-- HTTP 取样器 (调用接口,并在入参处引用 ${userId})
    |
    +-- HTTP 取样器 2(后续接口调用...)
    |
    ...
    |
    +-- HTTP 取样器 N (整个链路的最后一环)

实践结果

线程并发数为 n,用户参数里面的用户个数为 m

若 n <= m, 则只执行 n 次的用户请求,此时结果入参值动态获取

若 n > m, 则会执行 n 次的用户请求,超出 m 会重新开始读取用户参数

这种做法存在一个问题:看到的执行结果是乱的,因为并发执行的时候,本身就是无序的,没办法做到第一个用户执行完毕后第二个用户执行。

配置明细

单线程 + 控制器 + 用户自定义变量 + 用户参数

场景说明

复制代码
测试计划 (顺序执行: true)
|
+-- 线程组 (并发用户数: 1, 循环次数: 1)
    |
    +-- ForEach Controller(确定变量,及值的格式如:e=a_1)
        |
        +-- 用户对应的变量 (如:a_1 = 1, a_2 = 2)
        |
        +-- IF Controller(如环境 A, ${e} == 1)
            |
            +-- 用户参数(user parameter 环境 A)
                |   (userId_1)
                | 每次迭代更新一次:false/true,结果不同
        |
        +-- IF Controller(如环境 B, ${e} == 2)
            |
            +-- 用户参数(user parameter 环境 B)
                |   (userId_2)
                | 每次迭代更新一次:false/true,结果不同
        |
        +-- 事务控制器
            |
            +-- HTTP 取样器 (调用接口,并在入参处引用 ${userId})
            |
            +-- HTTP 取样器 2(后续接口调用...)
            |
            ...
            |
            +-- HTTP 取样器 N (整个链路的最后一环)

实战结果

上述配置方式,相当于是循环里面通过判断获取对应目标用户参数,通过这种方式来控制先执行那个用户参数后执行那个用户参数,看到的执行记录是有序的

配置明细

多并发 + 多接口 + 同步定时器

场景说明

复制代码
测试计划 (顺序执行: true)
|
+-- 线程组 (并发用户数: 8, 循环次数: 1)
    |
    +-- 用户参数(user parameter 环境 A)
      |   (userId_1)
      | 每次迭代更新一次:false/true,结果不同
    +-- 事务控制器
      |-- 同步定时器
      |
      +-- HTTP 取样器 (调用接口,并在入参处引用 ${userId})
      |
      +-- HTTP 取样器 2(后续接口调用...)
      |
      ...
      |
      +-- HTTP 取样器 N (整个链路的最后一环)

实践结果

未增加定时器,不同用户执行同一接口无序

增加定时器后,不同用户可同时执行同一接口

配置明细

总结

  1. 单线程 + CSV 参数化配置,可实现参数动态赋值;

  2. 单线程 + 循环控制器 + 用户参数,可实现不同参数赋值;

  3. 多线程 + 用户参数,可实现不同参数赋值;

  4. 多并发 + 多接口 + 同步定时器,可实现高并发下接口顺序执行;

相关推荐
se-tester1 天前
JMeter、Postman 和 SoapUI 在做接口测试上的优势和缺点
测试工具·jmeter·接口测试·postman·soapui
feathered-feathered2 天前
测试实战【用例设计】自己写的项目+功能测试(1)
java·服务器·后端·功能测试·jmeter·单元测试·压力测试
质量保障小乔7 天前
JMeter+Jenkins+AI自动化测试
jmeter
装不满的克莱因瓶9 天前
Java高并发异步请求实战,Jmeter暴力压测下的解决方案
jmeter·线程池·多线程·并发·resttemplate·qps·压测
在坚持一下我可没意见14 天前
ideaPool论坛系统测试报告
java·spring boot·功能测试·selenium·jmeter·mybatis·压力测试
linweidong16 天前
别让老板等:千人并发下的实时大屏极致性能优化实录
jmeter·clickhouse·性能优化·sentinel·doris·物化视图·离线数仓
CesareCheung17 天前
JMeter核心组件使用方法及场景大全
jmeter
我会一直在的18 天前
Jmeter的基础使用
功能测试·jmeter·压力测试
choke23318 天前
软件性能测试实战:从基础概念到 JMeter 全组件使用
jmeter
网络安全-杰克19 天前
Jmeter压力测试工具安装与使用
自动化测试·软件测试·测试工具·jmeter·职场和发展