在实际进行压力测试过程中,遇到了各种问题,经过不断的查找资料和尝试各种方法,最终将问题得以解决,将过程中的问题和解决的方法做一个总结,在后续遇到类似问题时,能够有一个参考和借鉴。总体上包括两类:一类是关于jmeter压力测试工具使用相关的,另一类是服务程序性能优化相关,这是重点,对于高并发应用,通常都会涉及性能优化。
1. 关于jmeter相关的问题
1.1 为什么要编写接口测试代码?
因为有些接口需要特殊格式的参数,比如需要特定的加密处理和解密处理,有的接口参数是动态生成的,有的接口参数是上一个接口返回的,所以测试接口有时没有办法直接写成固定的参数,此时就需要通过代码来实现。
1.2 如何编写代码调用接口,并提供给jmeter执行压力测试?
编写方法是参考官方提供的示例,创建测试工程,按照示例给出的规则进行接口调用编写,参数组织,最后将工程打包为jar,放到jmeter的lib/ext目录下,启动jmeter,然后就可以通过界面调用编写的测试接口了。通常可以采用idea或eclipse工具+maven打包。
测试代码Demo如下:
package com.test;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
public class JMeterTestDemo extends AbstractJavaSamplerClient {
private SampleResult results;
private String testStr;
// 准备测试
public void setupTest(JavaSamplerContext arg0) {
results = new SampleResult();
// 获取参数值
testStr = arg0.getParameter("Parameter1");
if(testStr!=null&&testStr.length()>0){
results.setSamplerData(testStr);
}
}
// 设置默认参数
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("Parameter1", "aaa");
return params;
}
@Override
public SampleResult runTest(JavaSamplerContext arg0) {
// TODO Auto-generated method stub
int len = 0;
// 设置开始时间
results.sampleStart();
len = testStr.length();
// 设置结束时间
results.sampleEnd();
// 根据测试结果,设置测试结果信息
if(len<5){
System.out.println("String is "+testStr);
results.setSuccessful(false);
}else{
System.out.println("String is "+testStr);
results.setSuccessful(true);
}
// 返回结果信息
return results;
}
public void teardownTest(JavaSamplerContext arg0) {
}
}
编译打包相关:
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_jav