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

整理测试点
用户参数 - 图1

添加用户参数

在请求上—【右键】—【添加】—【前置处理器】—【用户参数】
image.png

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

starttime ${intSum(${time(/1000,)},-86400)} ${__time(/1000,)} ${intSum(${time(/1000,)},86400)}
endtime ${intSum(${time(/1000,)},-79200)} ${intSum(${time(/1000,)},-7200)} ${intSum(${time(/1000,)},79200)}

在请求中使用定义的参数
image.png

  1. {
  2. "meetingroom_id":1,
  3. "subject":"周会",
  4. "start_time":${starttime},
  5. "end_time":${endtime},
  6. "booker":"zhangsan"
  7. }

image.png
运行

预定会议室.jmx


最终脚本

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


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

csv文件中定义了7条数据
image.png
用户参数中也定义7条数据
image.png
csv文件配置
image.png

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

常见面试问题

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

参考回答:
用户参数可以引用变量。
image.png
但是csv文件中只能是固定的值,不能引用变量。


使用场景上: 用户参数适合小数据量,当数据量比较大的时候编辑数据很不方便。
CSV数据文件的数据可以任意多。


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

根据业务场景,如果需要使用变量,我会选择 用户参数,如果数据量特别大,我会选择 csv数据文件配置。
如果数据量比较大,又需要用到变量,那我也可以同时选择使用他们两个。
具体使用可以参考上面: https://www.yuque.com/imhelloworld/bypiud/bo2ug7#hwHAd

练习

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


分析:

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

跨线程组参数传递

操作步骤

  1. 添加setup线程组。获取token这个操作不是我们本次测试的重点,我需要测试之前获取一下最新的token值。

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

  1. 创建添加会议室请求

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

  1. name,capacity
  2. ,10
  3. 123456789012345679012345678901,10
  4. 12345678901234567901234567890,0
  5. 12345678901234567901234567890,""
  1. 解决两个线程组中参数传递问题。

在获取token中 设置json提取器,
添加 beanshell 后置处理程序,使用代码设置 属性。
image.png

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

【测试计划】—【添加】—beanshell 预处理程序。
添加前置处理器— beanshell 前置处理程序。
image.png

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

image.png
运行,可以看到结果。 从第一个线程组中将参数传递到第二个线程组。
image.png
对应的jmx文件
上下游-csv-参数.jmx

面试问题

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

关键点:

  1. beanshell 处理器

参考回答:

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