JMeter实现登录初始化(类似LR的init函数功能实现)
1.项目背景
在做项目的性能测试过程中,发现系统的登录功能非常慢,所以,在涉及到登录才能操作的场景,尽量避开登录操作
解决方案:
首选设置“登录并生成签名值”线程组
String oldtimestamp = bsh.args[0]; print (oldtimestamp); ${__setProperty(timestamp,${oldtimestamp},)}
同样的,设置
import org.apache.commons.codec.digest.DigestUtils; public static String sha1(String data) { return DigestUtils.shaHex(data); } String a=vars.get("olduserId"); String b=vars.get("oldtoken"); String c=vars.get("oldtimestamp"); String inStr = a + b + c; System.out.println("inStr值:"+inStr); String test = sha1(inStr); //String qumf = test.toUpperCase(); //String qumf = test.toString().toUpperCase(); //String lwx = qumf.toLowerCase(); //String test = sha1("hhly92194b1c71bfd41e14e3e9a0bb84bb116b5761493984936911"); //11c3b934d7e15397ef5fe95a069885f926f40d46 System.out.println("sha1加密值:"+test); //System.out.println("sha1大写加密值:"+qumf); //System.out.println("sha2加密值:"+lwx); //vars.put("sign",qumf) //vars.put("sign",lwx) //vars.put("sign",test) //vars.put("signature",test) //props.put("sign",test); props.put("signature",test); //System.out.println("$sign");
设置全局HTTP信息头参数(项目中的参数都是通过http header参数传递)
执行hhly线程组中的请求(该请求需要登录后才能操作),演示效果如下
【_setProperty】函数介绍
作用:设置jmeter的属性值,函数的默认返回值是空字符串,因此该函数可以被用在任何地方,属性对于JMeter是全局的,因此可以被用来在线程和线程组之间通信
当遇到如跨线程组调用变量等情况,需要设置全局变量,可以通过JMeter中的属性解决
一、Jmeter中的属性:
1、JMeter属性统一定义在jmeter.properties文件中,我们可以在该文件中添加自定义的属性
2、JMeter属性在测试脚本的任何地方都是可见的(全局),通常被用来定义一些JMeter使用的默认值,可以用于在线程间传递信息。例如_setProperty函数
3、JMeter属性可以在测试计划中通过函数 _P 进行引用,但是不能作为特定线程的变量值。
使用全局变量就行
在a线程组后加入一个BeanShell PostProcessor处理器后,使用全局变量:${__setProperty(,,)}
使用时,使用全局变量:${__property(,,)}
4、JMeter属性可以通过_setProperty 函数来定义JMeter属性
输入需要的值然后点击生成按钮,或者直接使用${__setProperty(newuserid,${userid},)}的格式
设置局部变量userid和token为全局变量并在另一线程中调用,调用方式见下
5、JMeter属性是大小写敏感的
6、WorkBench中的属性查看组件:
WorkBench右键--->Add--->Non Test Elements--->Property Display
二、Jmeter中的变量:
1、JMeter变量对于测试线程而言是局部变量。
2、在不同测试线程中,JMeter变量既可以是完全相同的,也可以是不同的。
3、JMeter变量引用方法:${name}
4、JMeter变量是大小写敏感的
5、如果有某个线程更新了变量,那么仅仅是更新了变量在该线程中复制的值
6、Jmeter中定义变量的地方:
a) 测试计划(Test plan),在右边的面板上添加User Defined Variables
b) 线程组,右键选择 配置元件( config element)-->User Defined Variables
c) 通过前置或后置处理器生成的变量,可参考我的另一篇:Jmeter关联
d)使用csv参数化的变量,参数化可参考我另一篇:Jmeter参数化
注意:通过 a 和 b 两种方式定义的变量,在JMeter启动时对这个测试计划都是可见的。如果同一个变量在多个 b 中被定义,那么只有最后一个定义会生效。一旦某个线程启动后,
那么整个变量集合的初始值就会被复制到该线程中。其他测试元件,例如 c 或者 d 可以被用来重新定义变量,这些重定义仅仅影响当前线程。
文章参考:
作者:Agoly 出处:https://www.cnblogs.com/qmfsun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 |