最近测试同事在做压测过程中发现同样配置的两台服务器,部署同样的程序压测结果却差了很多(将近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上显示的结果如下:
image.png
其他几个方法的含义,我觉得注释已经足够清楚了。

打包

完成自己的代码之后,就要进行打包了。如果你的项目不是springboot,则直接打包。如果你的项目是springboot项目,则需要去掉相关springboot的引入,把它改为普通包,比如我这里就把相关的包注释掉:
image.png
然后在maven插件里,把springboot的打包方式也注释掉:
image.png
然后打包就可以了。

使用

基本工作都已经完成了,接下来开始看看怎么用。
找到jmeter的安装目录\lib\ext,把上一步生成的包丢进去,比如我目录是D:\安装包\apache-jmeter-5.4.1\lib\ext,则丢完之后:
image.png
如果你的项目中有依赖其他第三方jar的,则把依赖的第三方jar包也丢进去。
启动jmeter并创建对应的java request:
image.png
可以看到,我们自己写的测试类已经可以选到了。当然如果你需要显示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。


爱炒股的程序猿
50 声望4 粉丝

每天进步一点点