BeanShell 是一种完全符合 Java 语法规范的脚本语言。它允许用户在 JMeter 中编写自定义脚本。下面是一段用 BeanShell 生成随机数,并设置到 JMeter 变量上的代码:
import java.util.Random;
Random rand = new Random();
int num = rand.nextInt(100);
vars.put("randomNumber", String.valueOf(num));
在 JMeter 的很多地方都可以使用 BeanShell 脚本,如:采样器(BeanShell Sampler),前置处理器(BeanShell PreProcessor),后置处理器(BeanShell PostProcessor),断言(BeanShell Assertion),定时器(BeanShell Timer),监听器(BeanShell Listener)。使用 BeanShell 脚本可以很容易地扩展 JMeter 的功能,例如:
- 在测试计划中使用复杂的逻辑控制。
- 动态地生成HTTP请求参数。
- 在测试过程中处理响应数据。
- 自定义结果分析器。
BeanShell 的常用内置对象
log
记录日志。Jmeter 用 log4j 记录日志,打印的日志会记录到bin/jmeter.log文件。输出信息和错误的API 分别是 log.info``()
和 log.error()
。
vars
操作 JMeter 变量。JMeter 变量可以在 HTTP 请求等地方被用到。
需要注意的是: Jmeter 变量是在线程启动时,拷贝到线程的,类似线程的局部变量。所以一个线程更新了变量,不会影响到另一个线程。
获取变量:
vars.get("name")
设置变量。如果变量不存在会创建:
vars.put("key", "value")
props
操作 JMeter 的配置文件:jmeter.properties。
获取配置的值:
props.get("key")
设置配置的值:
props.put("key", value)
data
当前请求的响应数据,可以用String str = new String(data, "utf-8")转成字符串再打印出来。类型是byte[],即字节数组。
示例
以下示例展示了 BeanShell 的一些常见功能和应用场景。
计算两个变量的和
int num1 = Integer.parseInt(vars.get("num1"));
int num2 = Integer.parseInt(vars.get("num2"));
int sum = num1 + num2;
vars.put("sum", String.valueOf(sum));
构造 HTTP 请求参数
String param1 = URLEncoder.encode(vars.get("param1"), "UTF-8");
String param2 = URLEncoder.encode(vars.get("param2"), "UTF-8");
String params = "param1=" + param1 + "¶m2=" + param2;
vars.put("params", params);
获取 HTTP 响应头中的某个值
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
String url = vars.get("url");
DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
Header header = response.getFirstHeader("Content-Type");
String contentType = header.getValue();
vars.put("contentType", contentType);
执行 HTTP 请求并解析响应数据
import org.apache.commons.io.IOUtils;
import java.net.URL;
import java.nio.charset.StandardCharsets;
String url = vars.get("url");
String response = IOUtils.toString(new URL(url), StandardCharsets.UTF_8);
// 这边可以放解析响应的逻辑
vars.put("response", response);
发送电子邮件
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
String host = vars.get("host");
String port = vars.get("port");
String username = vars.get("username");
String password = vars.get("password");
String from = vars.get("from");
String to = vars.get("to");
String subject = vars.get("subject");
String body = vars.get("body");
Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
message.setSubject(subject);
message.setText(body);
Transport.send(message);
BeanShell 的优点
JMeter BeanShell具有以下优点:
- 扩展性:BeanShell 脚本可以轻松地扩展 JMeter 的功能,以满足更高级的测试需求。
- 灵活性:BeanShell 脚本可以与 JMeter 中的其他组件集成,可以应用于各种测试场景。
- 易用性:BeanShell 脚本可以使用 Java 语法编写,因此对于 Java 开发人员来说,学习成本较低。
- 可读性:BeanShell 脚本具有较高的可读性,可以方便地进行调试和修改。
BeanShell 的缺点
JMeter BeanShell的缺点包括:
- 性能:BeanShell脚本的性能不如 Java 代码,可能会对测试结果产生一定的影响。
- 学习成本:对于非Java 开发人员来说,学习 BeanShell 脚本可能需要一定的时间和精力。
- 维护成本:BeanShell 脚本的维护成本较高,需要及时更新和修复。
总结
JMeter BeanShell 的使用需要一定的编程知识,但它可以极大地提高 JMeter 的灵活性和可扩展性。如果您需要更高级的测试功能,可以尝试使用 JMeter BeanShell。
试试比 JMeter 更好用的 API 工具:Apifox
JMeter 可以用来做性能测试,但在日常工作中,我们还有更多的内容要做: API 设计,API 调试,API Mock 等。我们可能会使用多个工具,但在多个工具之间频繁切换(API 设计工具 Swagger、API 测试工具 JMeter)经常会导致数据不一致和团队协作低效率。
Apifox 是一款更加智能化的 API 设计/开发/测试工具,相较于 JMeter 软件,Apifox 有以下优势:
易于使用
Apifox 提供简单易用的界面和交互方式,用户不需要编写脚本或进行复杂的配置即可完成 API 测试。此外,Apifox 还提供了免费的模板和示例,帮助用户更快地创建 API 请求。
自动化测试
Apifox 提供了自动化测试的功能,用户可以通过自动化测试来减少测试时间和人力成本。用户只需要设置测试计划,Apifox 就可以自动运行测试,并生成测试结果和报告。此外,Apifox 还支持测试套件,可以一次性运行多个测试用例,提高测试效率。
多环境支持
Apifox 支持多个测试环境,用户可以通过切换环境来测试不同的 API。用户只需要设置环境变量,Apifox 就可以自动切换 API 请求的 URL 和参数。此外,Apifox 还支持环境导入和导出,方便用户在不同的设备或团队之间共享测试环境。
协作和分享
Apifox 提供了协作和分享的功能,用户可以与团队成员或其他人分享测试结果和测试数据。用户还可以将测试结果和报告导出为 HTML 格式。此外,Apifox 还支持团队协作和权限管理,可以让团队成员共享 API 设计和测试资源。
总之,相较于 JMeter,Apifox 更加易于使用和智能化,可以帮助用户更高效地进行 API 测试和管理。无论是个人开发者还是企业团队,都可以通过 Apifox 提高 API 测试的效率和质量。因此,越来越多人开始选择使用 Apifox 替代 JMeter。