内容简介:在以前的博文中,有介绍过,jmeter基本的关联,关联就是将参数在各接口中动态传参,使得接口脚本变得灵活使用,非一次性脚本。今天再来介绍一种jmeter全局变量的设置与使用,可以让脚本运用更丰富,场景覆盖更广。在做性能测试或多业务场景测试时,将多个业务写在多个线程组中,但都是一个正常的流程。全程只需登录一次,这时就需要设置全局变量来实现。我们也知道,只将token提取并设置为一个普通变量的话,是不能实现跨线程组调用的。跨线程组调用,只能引用全局变量。使用前置处理器BeanShell PreProcessor
在以前的博文中,有介绍过,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,如下:
注意
需要注意的是,多个线程间,将参数配置成了全局变量,但运行还是会报错,线程组间的接口请求乱序。此时,检查下测试计划里的配置,有个独立运行线程组的配置,如下所示。
本文仅代表作者观点,系作者@温一壶清酒发表。 欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 文章出处:http://www.cnblogs.com/hong-fithing/
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- java中线程安全,线程死锁,线程通信快速入门
- ObjC 多线程简析(一)-多线程简述和线程锁的基本应用
- Java多线程之线程中止
- Android 的线程和线程池
- iOS 多线程之线程安全
- java多线程 线程安全问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java Servlet & JSP Cookbook
Bruce W. Perry / O'Reilly Media / 2003-12-1 / USD 49.99
With literally hundreds of examples and thousands of lines of code, the Java Servlet and JSP Cookbook yields tips and techniques that any Java web developer who uses JavaServer Pages or servlets will ......一起来看看 《Java Servlet & JSP Cookbook》 这本书的介绍吧!