用户参数

使用csv文件配置可以比较灵活的配置多种数据,但是也存在一些缺点: 在csv文件中不能使用参数。比如预定会议室的时候需要有时间戳,这个时间戳不是固定的,之前的解决办法是使用Jmeter中函数助手,但是现在将函数助手生成的函数放在csv文件不能使用。

 

 

整理测试点

Jmeter用户参数、跨线程组参数传递_数据

 

 


 

 

添加用户参数

在请求上--【右键】--【添加】--【前置处理器】--【用户参数】

Jmeter用户参数、跨线程组参数传递_线程组_02

 

 

 

根据上面思维导图,先处理时间,下面是定义的三组时间。

Jmeter用户参数、跨线程组参数传递_json_03

 

 

starttime

${__intSum(${__time(/1000,)},-86400)}

${__time(/1000,)}

${__intSum(${__time(/1000,)},86400)}

endtime

${__intSum(${__time(/1000,)},-79200)}

${__intSum(${__time(/1000,)},-7200)}

${__intSum(${__time(/1000,)},79200)}

 

在请求中使用定义的参数

Jmeter用户参数、跨线程组参数传递_json_04

 

 

{
  "meetingroom_id":1,
  "subject":"周会",
  "start_time":${starttime},
  "end_time":${endtime},
  "booker":"zhangsan"

}

 

Jmeter用户参数、跨线程组参数传递_json_05

 

 

运行

 

????预定会议室.jmx

 

 


最终脚本

????测试计划-添加会议室-预定会议室.jmx

 


用户参数与csv文件配置一起使用

csv文件中定义了7条数据

Jmeter用户参数、跨线程组参数传递_json_06

 

 

用户参数中也定义7条数据

Jmeter用户参数、跨线程组参数传递_引用变量_07

 

 

csv文件配置

Jmeter用户参数、跨线程组参数传递_数据文件_08

 

 

 

????预定会议室-csv-用户参数.jmx

????meetingroom.csv

常见面试问题

  1. 用户参数设置的变量与CSV数据文件中设置的变量有什么区别?

参考回答:

用户参数可以引用变量。

Jmeter用户参数、跨线程组参数传递_线程组_09

 

 

但是csv文件中只能是固定的值,不能引用变量。


使用场景上: 用户参数适合小数据量,当数据量比较大的时候编辑数据很不方便。

CSV数据文件的数据可以任意多。


  1. 你是怎么用这两种类型的参数的?

根据业务场景,如果需要使用变量,我会选择 用户参数,如果数据量特别大,我会选择 csv数据文件配置。

如果数据量比较大,又需要用到变量,那我也可以同时选择使用他们两个。

具体使用可以参考上面: https://www.yuque.com/imhelloworld/bypiud/bo2ug7#hwHAd

 

 

练习

需要大家做一个 添加会议室接口的异常场景测试。这个里面我不需要测试token,也就是说每次测试都使用上下游传参的方式获取最新的token。


分析:

  1. 需要使用到上下游传参,上游获取token
  2. 需要用到数据驱动,不同的数据来测试添加会议室的异常场景。

跨线程组参数传递

操作步骤

  1. 添加setup线程组。建立setup线程组的目的是为了确保先运行该线程。获取token这个操作不是我们本次测试的重点,我需要测试之前获取一下最新的token值。

Jmeter用户参数、跨线程组参数传递_json_10

 

 

在setup线程组中添加 获取token的操作,获取完成之后将 token 设置为变量。

Jmeter用户参数、跨线程组参数传递_线程组_11

 

 

  1. 创建添加会议室请求

Jmeter用户参数、跨线程组参数传递_数据_12

 

 

使用csv数据驱动, csv文件中只设置 name,capacity字段。

name,capacity
,10
123456789012345679012345678901,10
12345678901234567901234567890,0
12345678901234567901234567890,""

 

  1. 解决两个线程组中参数传递问题。

 

添加 beanshell 后置处理程序,使用代码设置 属性。

Jmeter用户参数、跨线程组参数传递_数据_13

 

 

// 获取json提取器中设置token参数
String token = bsh.args[0];
// 将token具体的值设置为属性 属性名为 new_token
props.put("new_token",token);

这样更简单:

// 设置 属性, 属性名为token, bsh.args[0] 固定写法
props.put("token",bsh.args[0]);

 

【测试计划】--【添加】--beanshell 预处理程序。

添加前置处理器-- beanshell 前置处理程序。

Jmeter用户参数、跨线程组参数传递_引用变量_14

 

 

// 获取名称为 new_token的属性,对应的值赋值给变量 new_token
String new_token = props.get("new_token");
// 将newtoken的值设置为变量,变量名为为token
vars.put("token",new_token);

这样更简单:

// 取到属性值,设置为变量, props.get("topic_id")从上游接口中获取设置的属性。
vars.put("topic_id",props.get("topic_id"));

 

Jmeter用户参数、跨线程组参数传递_json_15

 

 

运行,可以看到结果。 从第一个线程组中将参数传递到第二个线程组。

Jmeter用户参数、跨线程组参数传递_数据_16

 

 

对应的jmx文件

????上下游-csv-参数.jmx

面试问题
  1. 两个不同的线程组,如何将第一个线程组中json提取器设置的变量,传递给第二个线程组?(线程组间动态传参怎么做?)

关键点:

  1. beanshell 处理器

参考回答:

  1. 在上游的线程组中通过json或者正则表达式提取器将要传递的值提取出来。
  2. 上游接口添加beanshell 后置处理程序,使用代码的方式将值设置为 属性。
  1. 测试计划上添加 【beanshell 预处理程序】,获取上一步的属性值,设置为变量。
  2. 下游其它线程组的接口中引用变量即可。