前言
看过我前面文章的人想必记得我因使用BeanShell,遭遇过JMeter OOM的问题。所以想起官网频频提示的,性能测试中建议使用JSR223+groovy来代替BeanShell。于是,开启BeanShell脚本向JSR223迁移之旅。
什么是JSR223
JSR223全称为Java Specification Request 223。其中JSR(Java Specification Request)是Java规范提案中的缩写,而JSR223是其中的一个提案,旨在将脚本语言集成到Java平台之上。所以,相比于BeanShell解释器,它支持更多的脚本语言:groovy、beanshell(java)、javascript、jexl和jexl2等。
同BeanShell一样,JSR223也包含多种组件:
- JSR223 PreProcessor:在执行取样器之前运行JSR223脚本代码的前置处理器。
- JSR223 PostProcessor:在执行取样器之后运行JSR223脚本代码的后置处理器。
- JSR223 Sampler:使用JSR223脚本编写的采样器。
- JSR223 Timer:基于JSR223脚本的定时器。
- JSR223 Assertion:用于验证响应的断言。
- JSR223 Listener:监听器,用于处理测试结果。
Groovy简介
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,能够与Java代码很好地结合,且无缝集成所有已经存在的Java对象和类库,所以,对于习惯于使用BeanShell+java的人来说,应该可以很平滑地迁移至JSR223+groovy。
然而,我将原有的BeanShell脚本换成JSR223的时候,却频频出错。
迁移尝试
我曾处理过一个使用BeanShell对请求入参进行加密的场景,BeanShell中的脚本如下:
import java.util.Base64;//使用StringBuild构建需要加密的json字符串
StringBuilder ori_data = new StringBuilder("{\"userOrgInfo\": {\"userInfo\": {\"userId\": \"123\",\"name\": \"123\",\"orderNo\": \"");
ori_data.append("IBS-DD-${__time(,)}${__Random(000,999,)}");
ori_data.append("\"}}}");
//执行加密
String encryptedData = Base64.getEncoder().encodeToString(ori_data.toString().getBytes());
//将加密结果赋值给encryptedData
vars.put("encryptedData", encryptedData);
//将不需要的字符串设置为null,以及时回收
oriDataStr = null;
encryptedData = null;
添加一个JSR223,将脚本粘贴进去,执行:
BUG! exception in phase 'semantic analysis' in source unit 'Script1.groovy' Unsupported class file major version 64
看起来是没找到类库。把代码全都注释掉,只留第一行import,仍然找不到。
BUG! exception in phase 'semantic analysis' in source unit 'Script2.groovy' Unsupported class file major version 64
它居然不能识别java的标准类库。。。。无缝集成?
查找原因
Jmeter集成的是Groovy 3.0.11,查了官网,有这么一句话:
Groovy 3.0 is the previous stable version of Groovy designed for JDK8+ with a new more flexible parser (aka Parrot parser).
而我电脑上的JDK是2.0
于是,重新安装一个JDK1.8,但是不敢卸载2.0,担心其它应用需要。所以,想要实现两个版本方便的切换。
Windows上切换JDK版本
按照如下步骤,设置环境变量:环境变量->环境变量
1、新建环境变量JAVA_HOME
分别创建一个JAVA_HOME8和一个JAVA_HOME10,输入它们的正确路径。
2、编辑系统变量->path
编辑->新建,输入%JAVA_HOME8%\bin,然后将它上移到第一个,至少是这些common Files的上面,它们是JDK在安装的过程中默认生成的环境变量,系统读取时从上向下,导致自己加的这个path不起作用。
3、切换JDK版本
想要切换JDK版本时,就修改path中的路径,指向JAVA_HOME8的路径时,便用jdk1.8,否则是jdk2.0
切换到jdk1.8后,再执行JSR223中的加密代码,顺利通过。不过这段代码仍有问题。下一次详述。
总结
Jmeter 5.5中集成的groovy版本为3.0.11,它需要的jdk版本是1.8。更多groovy与jdk版本信息,可查阅groovy官网:
The Apache Groovy programming language - Download