19

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

 4 years ago
source link: http://www.cnblogs.com/hong-fithing/p/12403480.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

应用场景

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

使用场景

前置处理器BeanShell PreProcessor

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

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

EnEfi2V.png!web

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

7JvyIf7.png!web

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

UVNBreR.png!web

在请求头中查看token数据

ZZZRzqb.png!web

后置处理器BeanShell PostProcessor

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

FbYviyR.png!web

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

7JvyIf7.png!web

执行脚本,查看数据

MJVF3ab.png!web

__setProperty(,,)函数

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

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

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

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

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

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

6vaY3uR.png!web

在线程组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,不保存结果值。

NzINBzV.png!web

运行脚本,查看结果

UjYJvaM.png!web

参数化跨线程传参

使用后置处理器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配置如下:

JBbYrmb.png!web

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

BRR3umN.png!web

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

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

AV32em6.png!web

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

RR3eYrZ.png!web

注意

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

juuEvme.png!web

本文仅代表作者观点,系作者@温一壶清酒发表。
欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
文章出处:http://www.cnblogs.com/hong-fithing/

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK