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. 多并发 + 多接口 + 同步定时器,可实现高并发下接口顺序执行;

相关推荐
文人sec3 天前
性能测试-jmeter9-逻辑控制器、定时器压力并发
测试工具·jmeter·性能优化·模块测试
CesareCheung5 天前
JMeter分布式压力测试
分布式·jmeter·压力测试
测试界清流5 天前
jmeter使用技巧
jmeter
春时似衿里5 天前
jmeter配置数据库连接步骤
数据库·jmeter
新知图书5 天前
JMeter的安装部署
jmeter
程序员杰哥5 天前
什么是Jmeter? Jmeter工作原理是什么?
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·测试用例
乐神嘎嘎嘎5 天前
Jmeter测试
jmeter
卓码软件测评5 天前
第三方软件测试机构【性能测试工具用LoadRunner还是JMeter?】
java·功能测试·测试工具·jmeter·性能优化
BatyTao6 天前
Jmeter执行数据库操作
数据库·jmeter
二宝哥6 天前
性能测试工具Jmeter之java.net.BindException: Address already in use
jmeter