loadrunner java脚本编写
最近需要对某个接口进行性能测试,使用原有的性能测试脚本进行压测,发现脚本中没有进行唯一性区分的字段,通讯数据无法重复使用,重复数据发送到服务器后,服务器会判定为重复数据,不处理。
Loadrunner发送数据为加密数据,解析该数据后发现加密前数据有***等信息,为保证loadrunner有足够的数据,需要在loadrunner内实现通讯数据的加密。
2.方案:
1)采用 java vuser脚本,首先提取组合加密前通讯数据,将该数据加密。2)http发送通讯数据。
3.具体实现:
1)环境搭建:
1)Loadrunner11只支持1.6以前的版本,安装jdk1.6。
2)替换加密包:替”jdk1.6.0_45\jre\lib\security”内local_policy.jar US_export_policy.jar,两个jar包用于aes加密。
加密jar文件生成:编写加密程序(主程序代码)
2)程序编写
public static String encrypt(String text) throws InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException {
byte[] aeskey = Base64.decodeBase64("eXyf6aw52rGisfyrtjnjhHFKT4DttG2rn2sPPb12dOO=");
byte[] src = text.getBytes();
byte[] allmsg = new byte[src.length + 20];
byte[] msgLeng = intToByteArray1(src.length);
System.arraycopy(aeskey, 0, allmsg, 0, 16);
System.arraycopy(msgLeng, 0, allmsg, 16, 4);
System.arraycopy(src, 0, allmsg, 20, src.length);
SecretKey secretKey = new SecretKeySpec(aeskey, 0, 32, "AES");
Cipher cipher = null;
cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(aeskey, 0, 16));
byte [] b = cipher.doFinal(allmsg);
String ret = Base64.encodeBase64String(b);
return ret;
}
代码完成后,打成jar包 aes.jar,需要用到jar包bcprov-jdk15on-1.54.jar、commons-codec-1.10.jar,根据自己依赖的包进行调整。
将程序加载到脚本中vuser-->runtimesetting-->classpath-->添加依赖jar包。
3)调用
引入
代码里设置为静态变量,可以直接调用:
4) 脚本编写
Java vuser本身并不支持录制,因此需要将C录制的脚本修改为java语言。
函数 |
C语言 |
java |
事务 |
Lr_start_transaction("数据加密"); Lr_end_transaction("数据加密",lr.PASS); |
lr.start_transaction("数据加密"); lr.end_transaction("数据加密",lr.PASS); |
http请求 |
Web_custom_request |
web.custom_request |
计时 |
timer=lr_start_timer(); end_timer=lr_end_timer(timer); |
timer=lr.start_timer(); end_timer=lr.end_timer(timer); |
如何将C修改为JAVA:F1帮助。
一个要点:有些函数是需要import 库的。例:web.custom_request
在将http请求修改完成后,运行始终报错,查找一些网上示例发现其中引入了web的包:import lrapi.web,此时方能使用该http请求
5)运行
Java脚本需要相应的运行环境,因此压力机也需要部署相应的环境,这个在上面已经讲述:
Jdk
Jdk替换的jar包
实现加密程序的jar包
6)Tips:使用controller运行时,并发较大时(超过500),不能使用process进程运行,必须使用thread方式运行,否则压力机内存会不足。