需要的资源
- Jmeter软件(5.3)
- 一个maven工程
1.我们新建一个maven工程
- pom文件配置两个核心jmeter jar
<!-- Jmeter需要的两个核心jar -->
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.1.1</version>
</dependency>
</dependencies>
- pom文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>test-jmeter</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- Jmeter需要的两个核心jar -->
<dependencies>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>5.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>5.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-files</id>
<phase>package</phase>
<configuration>
<tasks>
<!--将生成的项目jar拷贝到jmeter的lib/ext目录下 -->
<copy file="${project.build.directory}/test-jmeter-1.0-SNAPSHOT.jar" tofile="D:\LookingNorth\Tools\JMeter\apache-jmeter-5.3\lib\ext\test-jmeter-1.0-SNAPSHOT.jar" overwrite="true" />
<copy file="${project.build.directory}/test-jmeter-1.0-SNAPSHOT-jar-with-dependencies.jar" tofile="D:\LookingNorth\Tools\JMeter\apache-jmeter-5.3\lib\ext\test-jmeter-1.0-SNAPSHOT-jar-with-dependencies.jar" overwrite="true" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<!--将项目所依赖的jar打包成一个jar-->
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!-- 加上下面这一段,使用 mvn package命令,不加则使用mvn assembly-->
<executions>
<execution>
<id>make-assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
- JmeterTest测试类需要继承AbstractJavaSamplerClient
package 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;
import org.slf4j.Logger;
public class JmeterUtil extends AbstractJavaSamplerClient {
@Override
protected Logger getNewLogger() {
//获取Jmeter日志输出类,会在Jmeter的控制台打印(前提用jmeter.bat脚本启动,才会出现控制台)
return super.getNewLogger();
}
/**
* 设置需要的请求参数并设置参数默认值,会在jmeter 显示
* Arguments 这个方法会默认设置到JavaSamplerContext 中去
* JavaSamplerContext 是一个上下文,可以在方法之间传递信息
* @return
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("host", "www.baidu.com");
arguments.addArgument("appKey", "123");
arguments.addArgument("appSecret", "123");
arguments.addArgument("apiNo", "123");
arguments.addArgument("requestTye", "list");
arguments.addArgument("bodyJsonStr", "{\"conditions\":{\"id\":1},\"pageSize\":10,\"pageStart\":1,\"returnFields\":[\"name\"],\"useModelCache\":false,\"useResultCache\":false}");
getNewLogger().info("getDefaultParameters()");
System.out.println("getDefaultParameters");
return arguments;
}
/**
* 测试之前的初始化工作
* JavaSamplerContext 是一个上下文,可以在方法之间传递信息
* @param context
*/
@Override
public void setupTest(JavaSamplerContext context) {
getNewLogger().info("setupTest()");
System.out.println("setupTest");
int apiId = context.getIntParameter("apiId");
System.out.println("apiId:" + apiId);
super.setupTest(context);
}
/**
* 测试的业务逻辑
* SampleResult 设置返回给jmeter的一些信息
* JavaSamplerContext 是一个上下文,可以在方法之间传递信息
* @param context
* @return
*/
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sampleResult = new SampleResult();
// 获取getDefaultParameters()设置的业务参数
String host = context.getParameter("host");
this.getNewLogger().info("host:" + host);
String appKey = context.getParameter("appKey");
this.getNewLogger().info("appKey:" + appKey);
String appSecret = context.getParameter("appSecret");
this.getNewLogger().info("appSecret:" + appSecret);
String apiNo = context.getParameter("apiNo");
this.getNewLogger().info("apiNo:" + apiNo);
String requestTye = context.getParameter("requestTye");
this.getNewLogger().info("requestTye:" + requestTye);
String bodyJsonStr = context.getParameter("bodyJsonStr");
this.getNewLogger().info("bodyJsonStr:" + bodyJsonStr);
// 业务返回数据
String result = "";
// 开始测试
sampleResult.sampleStart();
try {
// TODO 你测试主要的业务方法
result = excute(host, appKey, appSecret, apiNo, requestTye, bodyJsonStr);
this.getNewLogger().info("响应结果:\n" + result);
// 设置成功信息
sampleResult.setResponseCodeOK();
sampleResult.setResponseCodeOK();
// 返回成功的数据---可以在jmeter软件--java请求看到返回的数据
sampleResult.setResponseData(result.getBytes(StandardCharsets.UTF_8));
sampleResult.setDataType(SampleResult.TEXT);
sampleResult.setSuccessful(true);
} catch (Exception var11) {
var11.printStackTrace();
// 设置失败信息
sampleResult.setResponseMessage("server error");
sampleResult.setResponseCode("500");
sampleResult.setSuccessful(false);
}
// 结束测试
sampleResult.sampleEnd();
return sampleResult;
}
/**
* 测试结束时候调用
* JavaSamplerContext 是一个上下文,可以在方法之间传递信息
* @param context
*/
@Override
public void teardownTest(JavaSamplerContext context) {
getNewLogger().info("teardownTest()");
System.out.println("teardownTest");
super.teardownTest(context);
}
}
- 我们重写了5个方法
1 getNewLogger 获取日志类,打印日志的
2 getDefaultParameters 利用Arguments设置一些参数可以传递到jmeter 上下文中,这些参数会显示在jmeter工具界面上
3 setupTest 你可以设置一些初始化的业务操作,JavaSamplerContext就是jmeter的上下文,可以取出你在getDefaultParameters()方法中设置的一些值
4 runTest 这里可以编写你要压测的业务逻辑
5 teardownTest 测试结束时候调用
2 我们对项目进行打包 mvn package
- 我们在pom配置了把项目所依赖的资源打成一个jar
<plugin>
<!--将项目所依赖的jar打包成一个jar-->
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<!-- 加上下面这一段,使用 mvn package命令,不加则使用mvn assembly-->
<executions>
<execution>
<id>make-assemble</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
- 我们为了偷懒,拒绝CV,配置了一个打包的任务,假如你很勤快,就把那打包生成两个jar复制到jmeter\lib\ext里面去。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-files</id>
<phase>package</phase>
<configuration>
<tasks>
<!--将生成的项目jar拷贝到jmeter的lib/ext目录下 -->
<copy file="${project.build.directory}/test-jmeter-1.0-SNAPSHOT.jar" tofile="D:\LookingNorth\Tools\JMeter\apache-jmeter-5.3\lib\ext\test-jmeter-1.0-SNAPSHOT.jar" overwrite="true" />
<copy file="${project.build.directory}/test-jmeter-1.0-SNAPSHOT-jar-with-dependencies.jar" tofile="D:\LookingNorth\Tools\JMeter\apache-jmeter-5.3\lib\ext\test-jmeter-1.0-SNAPSHOT-jar-with-dependencies.jar" overwrite="true" />
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
3 配置jmeter
- 1 我们安装好了jmeter之后,进入bin文件夹中点击windows 启动脚本jmeter.bat
-
2 我们新建一个测试计划》新建线程组
- -
3 新建 Sample》Java Request
- -
4 我们可以在Jmeter可以选择我们刚刚编写的业务类以及一些参数
在这里插入图片描述
-
5 点击运行,我们控制台(博客代码做了修改可能打印的数据和代码输出的对比不上,请忽略,只会输出System.out,日志打印会单独放在jmeter\bin\jmeter.log文件中)会按顺序输出我们刚刚写那几个方法,
getDefaultParameters
setupTest
apiId:123
runTest
appKey:789
teardownTest
- 6 收工