一、簡介
使用Jmeter性能測試工具,實現hessian接口的性能測試、接口測試、工具類集成等3個功能。
需要環境:JDK1.8、maven、Jmeter、eclipse或者 IntelliJ IDEA;
二、調試hessian接口測試類,封裝Java請求;
1.新建maven項目;
2.配置pom.xml文件;
<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>jmeterApiTest-6</groupId>
<artifactId>jmeter-api-test-6</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>jmeter-api-test-6</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- 被測接口所依賴jar包,根據需要配置 -->
<dependency>
<groupId>cn.facebank</groupId>
<artifactId>fpmain-api-manage-service</artifactId>
<version>1.0.0.7</version>
</dependency>
<dependency>
<groupId>cn.facebank</groupId>
<artifactId>fpmain-api-model</artifactId>
<version>1.0.0.8</version>
</dependency>
<dependency>
<groupId>cn.facebank</groupId>
<artifactId>fpmain-api-user-service</artifactId>
<version>1.0.0.2</version>
</dependency>
<!-- hessian接口依賴包 -->
<dependency>
<groupId>com.caucho</groupId>
<artifactId>hessian</artifactId>
<version>4.0.38</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>jorphan</artifactId>
<version>3.1</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.1</version>
<exclusions>
<exclusion>
<groupId>d-haven-managed-pool</groupId>
<artifactId>d-haven-managed-pool</artifactId>
</exclusion>
<exclusion>
<artifactId>commons-math3</artifactId>
<groupId>commons-math3</groupId>
</exclusion>
<exclusion>
<artifactId>commons-pool2</artifactId>
<groupId>commons-pool2</groupId>
</exclusion>
</exclusions>
<scope>provided</scope>
</dependency>
</dependencies>
<!-- 依賴jar包 jar-with-dependencies -->
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass></mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
3.新建下單接口測試類AddFpOrderTest,並繼承AbstractJavaSamplerClient;
4.下單接口測試代碼如下:
package jmeterApiTest_6.jmeter_api_test_6;
import java.io.IOException;
import java.math.BigDecimal;
import java.net.MalformedURLException;
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 com.caucho.hessian.client.HessianProxyFactory;
import cn.facebank.common.exception.PlateformException;
import cn.facebank.fpmain.api.model.FpOrderModel;
import cn.facebank.fpmain.api.user.service.FpOrderService;
public class AddFpOrderTest extends AbstractJavaSamplerClient {
// 創建LGroupon類,繼承了AbstractJavaSamplerClient
private long start = 0;
private long end = 0;
private String amount;// BigDecimal
private String path;
private String productId;// Long
private String userId;// Long
private String redPackageId;// String
// 初始化方法,實際運行時每個線程僅執行一次,在測試方法運行前執行
public void setupTest(JavaSamplerContext arg0) {
// 開始時間
System.out.println("開始執行......start");
start = System.currentTimeMillis();
}
// 設置默認值,如果Jmeter中未設置變量,用此默認值
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("productId", "38");
params.addArgument("userId", "572004");
params.addArgument("amount", "1200");
params.addArgument("redPackageId", "");
params.addArgument("path", "http://192.168.1.5:25008");
return params;
}
// 運行runTest程序,調用hessian接口
public SampleResult runTest(JavaSamplerContext arg0) {
System.out.println("調用訂單提交接口開始...........start");
productId = arg0.getParameter("productId");
userId = arg0.getParameter("userId");
amount = arg0.getParameter("amount");
redPackageId = arg0.getParameter("redPackageId");
path = arg0.getParameter("path");
SampleResult results = new SampleResult();
results.setSampleLabel("Java請求");
results.sampleStart();// jmeter 開始統計響應時間標記
try {
// 通過下面的操作就可以將被測方法的響應輸出到Jmeter的察看結果樹中的響應數據里面了。
addFpOrder(Long.valueOf(productId), Long.valueOf(userId),
new BigDecimal(amount).setScale(2,
BigDecimal.ROUND_HALF_EVEN), redPackageId);
results.setSuccessful(true);
System.out.println("調用訂單提交接口結束...........over");
} catch (Throwable e) {
results.setSuccessful(false);
e.printStackTrace();
} finally {
results.sampleEnd();// jmeter 結束統計響應時間標記
}
System.out.println("結束執行.....over");
return results;
}
// 測試結束時調用;
public void teardownTest(JavaSamplerContext arg0) {
end = System.currentTimeMillis();
System.out.println(end);
System.out.println("The cost is" + (end - start) + "ms");
}
// 提交訂單接口實現方法,一般從開發人員單元測試類中獲取
public void addFpOrder(Long productId, Long userId, BigDecimal amount,
String redPackageId) throws PlateformException, IOException {
String url = path + "/remoting/fpOrderService";
FpOrderService fpOrderService = (FpOrderService) getHessianProxyService(
url, FpOrderService.class);
FpOrderModel model = new FpOrderModel();
model.setFpOrderId(0L);
model.setProductId(productId);
model.setUserId(userId);
model.setAmount(amount);
model.setRemark("");
fpOrderService.addFpOrder(model, redPackageId);
}
public Object getHessianProxyService(String url, Class classInstance) {
HessianProxyFactory factory = new HessianProxyFactory();
Object service = null;
try {
service = factory.create(classInstance, url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return service;
}
// main只是為了調試用,最后打jar包的時候注釋掉。
public static void main(String[] args) {
// 獲取需要變量
Arguments params = new Arguments();
params.addArgument("productId", "159875425");
params.addArgument("userId", "572004");
params.addArgument("amount", "1000");
params.addArgument("redPackageId", "");
params.addArgument("path", "http://192.168.1.5:25008");
JavaSamplerContext arg0 = new JavaSamplerContext(params);
AddFpOrderTest addFpOrderTest = new AddFpOrderTest();
addFpOrderTest.setupTest(arg0);
addFpOrderTest.runTest(arg0);
addFpOrderTest.teardownTest(arg0);
}
}
5.腳本調試通過后,注釋main方法;
6.右鍵項目名稱,選擇 Run As>Maven assembly:assembly,生成兩個jar包;
三、Jmeter集成接口測試jar包;
1.將兩個jar包放在Jmeter路徑\apache-jmeter-3.1\lib\ext 下;
2.打開Jmeter,新建測試計划-線程組-Java請求;
3.選擇需要進行測試的接口名稱,並填寫相應變量;
4.配置Jmeter測試計划,進行性能測試/接口測試/工具類使用;
5.如果開發並未提供測試類,可直接對原來的方法進行調用
如例子中的下訂單,原來的方法為:
public Long addFpOrder(final FpOrderModel model, String redPackageId) throws PlateformException, IOException
可以自己定義一個model , 並將傳入的參數賦值給 model對象即可。
6.添加下單接口腳本