Jmeter——如何使得token在各线程组间引用的游刃有余

在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本。今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景覆盖更广。

应用场景

在做性能测试或多业务场景测试时,将多个业务写在多个线程组中,但都是一个正常的流程。全程只需登录一次,这时就需要设置全局变量来实现。我们也知道,只将token提取并设置为一个普通变量的话,是不能实现跨线程组调用的。跨线程组调用,只能引用全局变量。

使用场景

前置处理器BeanShell PreProcessor

使用前置处理器BeanShell PreProcessor,编写如下代码:

通过vars.put()方法,将a1的值写入到token中

在信息头中,引用该参数如下,使用的是__P()函数,__P()是一个简化的属性函数,用于与命令行上定义的属性一起使用。

运行脚本,查看数据,在运行日志中查看token

在请求头中查看token数据

后置处理器BeanShell PostProcessor

使用后置处理器BeanShell PostProcessor,编写代码如下:

在线程组2中的信息头里引用如下

执行脚本,查看数据

__setProperty(,,)函数

在后置处理器中,使用__setProperty(,,)函数,函数介绍如下:

该函数用于设置 JMeter 属性的值。

函数的默认返回值是空字符串,因此该函数可以被用在任何地方,只要对函数本身调用是正确的。

通过将函数可选的第3个参数设置为"true",函数就会返回属性的原始值。

属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信。

在后置处理器中,编写代码如下:

在线程组2中的信息头中引用如下:

__property函数是用于获取属性值

示例:

${__property(department.id)} 返回 department.id 的值。
${__property(department.id,UUID)} 返回 department.id 的值,并保存在变量 UUID 中。

${__property(abcd,ABCD,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,并保存在变量 ABCD 中。
${__property(abcd,,atod)} 返回属性 abcd 的值,如果该属性未定义则返回 atod,不保存结果值。

运行脚本,查看结果

参数化跨线程传参

使用后置处理器BeanShell PostProcessor,将登录获取到的token,写入到文件中,并引用csv元件进行参数化。这种方式稍微麻烦点,但还是能够满足跨线程调用参数的,后置处理器中的参考代码如下:

 1 import java.io.BufferedReader;
 2 import java.io.File;
 3 import java.io.FileReader;
 4 import java.io.IOException;
 5 import java.io.FileWriter;
 6 import java.io.BufferedWriter; 
 7 
 8 String filePath = System.getProperty("user.dir") + "/login.txt";
 9 log.info(System.getProperty("user.dir") + "/login.txt" );
10 vars.put("filePath",filePath);
11 File file = new File(filePath);
12 
13 try {
14     if (file.exists()){
15         file.delete();
16     }
17     file.createNewFile();
18     FileWriter fs = new FileWriter(filePath,true);
19     BufferedWriter bw = new BufferedWriter(fs);
20 
21     String token=vars.get("accessToken");
22     log.info("写入的token:" + token);
23     bw.write(token);
24     bw.write(System.getProperty("line.separator"));
25     fs.flush();
26     bw.close();
27     fs.close();
28     
29     
30 }catch(IOException e) {
31     e.printStackTrace();
32 }

csv的参数配置,这里就不赘述了,可以查看以前的博文,有详细介绍。

在线程组2中引用csv元件,读取保存到文件中的token,csv配置如下:

在信息头中引用token,配置如下:

我们来运行脚本,查看下运行结果,是否成功?

看如下截图,日志打印写入到文件中的token与线程组2请求传递的token是一样的,脚本运行成功,实现了token跨线程的调用。

再来看下保存到文件中的token,如下:

注意

需要注意的是,多个线程间,将参数配置成了全局变量,但运行还是会报错,线程组间的接口请求乱序。此时,检查下测试计划里的配置,有个独立运行线程组的配置,如下所示。

posted @ 2020-03-21 13:10  温一壶清酒  阅读(1301)  评论(0编辑  收藏  举报