前些天用JMeter写了一个接口的自动化脚本,请求参数加密和响应数据解密都覆盖到了,中间涉及了BeanShell脚本编写和导入jar包的一些方法,想着挺有代表性的,分享给大家,希望对大家的接口自动化测试有所启发。
这是一个注册接口,请求方法是get,请求参数有两个,一个是salt,一个是params,salt取随机值,params需要调用开发同学提供的jar包。
下面主要分为四个步骤来介绍:
一、安装JD-GUI工具
二、导入jar包
三、JMeter的BeanShell基础知识科普
四、BeanShell脚本实例解析
一、安装JD-GUI工具
这个工具可用来查看jar包,安装步骤如下:
一)官网下载安装包
进入Java Decompiler,点击Download,下载文件:jd-gui-windows-1.6.6.zip
二)解压后安装
将文件解压,双击jd-gui.exe文件打开文件
三)将jar包拖入JD-GUI,即可查看文件
二、导入jar包
jar包是由开发同学提供的,里面封装了加密和解密的函数,测试同学不用关心怎么实现的,直接调用即可。导入jar包主要有两种方法:
一)将jar包放到JMeter的lib/ext目录下
放好后,再重启JMeter即可。
二)在测试计划中引入
右键测试计划--Add directory or jar to classpath--浏览,添加jar包即可,不需要重启JMeter。
三、JMeter的BeanShell基础知识科普
一)BeanShell的特点
在 JMeter 中,BeanShell 是一种支持使用 Java 编程语言进行脚本编写和执行的可扩展功能,以下是关于 JMeter 的 BeanShell 的一些关键特点:
- 脚本语言:BeanShell 是一种脚本语言,它与 Java 语言高度相似,几乎支持所有 Java 语法和语言特性。这使得 Java 开发人员可以轻松地使用 BeanShell 编写脚本,而不需要学习全新的脚本语言。
- 支持 Java 类:BeanShell 允许直接导入和使用 Java 类和包。这意味着你可以在脚本中使用 Java 类的方法和属性。
- 引入第三方库:通过使用 BeanShell 可以引入第三方 Java 库,从而扩展 JMeter 的功能。
- BeanShell Sampler:JMeter 提供了 BeanShell Sampler,它允许你在测试计划中直接编写和执行 BeanShell 脚本,从而可以自定义测试逻辑和操作。
由于 BeanShell 脚本在运行时会被动态解释执行,可能会对性能产生一定影响,特别是当脚本非常复杂或执行频率较高时。如果性能是一个关键问题,建议使用 JMeter 的原生元件来实现测试逻辑。
二)BeanShell脚本常用函数
1、log(infoMessage)
用于将信息输出到 JMeter 的日志文件,例如:
log.info("This is an informational message.");
2、vars
代表 JMeter 的 JMeterVariables 对象,用于访问和操作用户定义的变量,vars对象只能操作String类型 ,例如:
// 设置一个自定义变量
vars.put("myVar", "Hello, World!");
// 获取自定义变量的值
String myValue = vars.get("myVar");
log.info("myVar value: " + myValue);
3、 getResponseDataAsString()
是 JMeter 中 SampleResult 对象的一个方法,用于获取当前采样结果的响应数据(Response Data)并将其作为字符串返回。这个方法通常在 Beanshell Sampler 或 Beanshell PostProcessor 中使用。
// 在 Beanshell PostProcessor 中获取响应数据并处理
import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
// 获取前一个请求的 SampleResult 对象
SampleResult prevResult = prev;
// 判断响应是否成功
if (prevResult.isSuccessful()) {
// 获取响应数据作为字符串
String responseData = prevResult.getResponseDataAsString();
log.info("Response Data: " + responseData);
// 在这里你可以对响应数据进行进一步的处理,如解析 JSON、提取数据等
// 例如,假设响应数据是 JSON 格式的,你可以使用 JSON 解析库对其进行解析
// 假设响应数据包含 "name" 字段,并提取该字段的值
String name = parseNameFromJson(responseData);
log.info("Extracted Name: " + name);
// 将提取的数据存储到 JMeter 变量中
vars.put("extractedName", name);
}
4、getResponseCode()
是 JMeter 中 SampleResult 对象的一个方法,用于获取当前采样结果的响应代码(Response Code)。该方法返回一个字符串,表示服务器对请求的响应状态码。
// 在 Beanshell PostProcessor 中获取响应状态码并判断请求是否成功
import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
// 获取前一个请求的 SampleResult 对象
SampleResult prevResult = prev;
// 获取响应状态码
String responseCode = prevResult.getResponseCode();
log.info("Response Code: " + responseCode);
// 判断响应是否成功
if (responseCode.equals("200")) {
// 请求成功的处理逻辑
log.info("Request was successful.");
} else {
// 请求失败的处理逻辑
log.warn("Request failed. Response Code: " + responseCode);
}
三)BeanShell脚本导入jar包的方法
1、导入jar的类
格式是:import 包名.类名
2、调用函数
格式是:类名.函数名(参数)
四、BeanShell脚本实例解析
一)新建线程组
二)添加HTTP请求默认值
三)添加前置处理器BeanShell PreProcessor
1、给请求参数salt赋值
2、给请求参数key赋值
3、给请求参数params赋值
先导入jar包的类,如下图的import com.tkx.util.EncryptUtil,然后调用类的函数,如下图的String [] = EncryptUtil.encrypt(content,key,salt);
四)添加HTTP请求
五、添加后置处理器BeanShell PostProcessor
用来解密请求,同前置处理器的方法,先导入jar包的类,然后调用类的函数
六、添加BeanShell断言
先获取响应信息,然后进行状态码或响应数据的断言
代码如下:
import java.lang.String;
import org.apache.jmeter.protocol.http.sampler.HTTPSampleResult;
//获取响应信息
String response = prev.getResponseDataAsString();
log.info("响应状态码:"+ ResponseCode);
log.info("响应头信息:"+ ResponseHeaders);
log.info("响应体数据:"+ response);
//状态码断言
log.info("状态码:" + ResponseCode);
if(ResponseCode.equals("200")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="响应状态码非200"; // 自定义的失败信息
}
//响应数据断言
if(response.contains("注册成功")){
Failure=false; // 表示断言成功
}
else{
Failure=true; // 表示断言失败
FailureMessage="注册失败";
}
七、添加察看结果树
这样,一个接口的加密和解密过程就完全自动化了。