最近测试同事在做压测过程中发现同样配置的两台服务器,部署同样的程序压测结果却差了很多(将近100tps),测试同事用的是loadrunner进行的压测,为了不占用测试资源,本地能够模拟出压测结果,需要在jmeter中自定义测试用例。下面介绍一下如何进行自定义。
引入jmeter的jar包
新建一个maven项目,结合你安装的jmeter版本,引入对应的版本jar包,主要是ApacheJMeter_core和ApacheJMeter_java,我这里用的是5.4.1
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.4.1</version>
</dependency>
创建自己的用例
创建你自己的测试类,需要继承AbstractJavaSamplerClient,并实现他的几个接口,对应的方法执行时机,我在下面代码中注释了
public class MyTester extends AbstractJavaSamplerClient {
//执行测试代码,主要的逻辑
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
return null;
}
//执行之前的初始化逻辑
@Override
public void setupTest(JavaSamplerContext var1){
}
//结束方法
@Override
public void teardownTest(JavaSamplerContext var1){
}
//java request界面的参数
@Override
public Arguments getDefaultParameters(){
return null;
}
}
这样看可能不是很清楚,举个例子:
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("host", "");
return params;
}
上面代码我实现了getDefaultParameters方法,并设置了一个host参数,那么在jmeter上显示的结果如下:
其他几个方法的含义,我觉得注释已经足够清楚了。
打包
完成自己的代码之后,就要进行打包了。如果你的项目不是springboot,则直接打包。如果你的项目是springboot项目,则需要去掉相关springboot的引入,把它改为普通包,比如我这里就把相关的包注释掉:
然后在maven插件里,把springboot的打包方式也注释掉:
然后打包就可以了。
使用
基本工作都已经完成了,接下来开始看看怎么用。
找到jmeter的安装目录\lib\ext,把上一步生成的包丢进去,比如我目录是D:\安装包\apache-jmeter-5.4.1\lib\ext,则丢完之后:
如果你的项目中有依赖其他第三方jar的,则把依赖的第三方jar包也丢进去。
启动jmeter并创建对应的java request:
可以看到,我们自己写的测试类已经可以选到了。当然如果你需要显示tps报告的,则需要在请求之前和响应之后的逻辑上添加统计逻辑
SampleResult sr = new SampleResult();
sr.sampleStart(); //开始统计
String result = TcpUtil.send(host, content);
sr.sampleEnd(); //结束统计
View Result Tree里的结果,也可以通过你对实际报文的解析来控制成功还是失败
if (isSucess(result)) {
sr.setSuccessful(true);
}
else {
sr.setSuccessful(false);
}
总结
整体上来说还是比较简单的,只要知道jmeter提供的几个操作都是什么含义的。主要的坑还是在打包,你不能打个springboot包放进去,这样jmeter不认,最好是减少第三方包的依赖,但这样也增加了我们写代码的难度,如果写的不好,也会影响整体tps。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。