jmeter支援自定義java腳本的壓測。編寫java腳本,需要實作JavaSamplerClient接口或繼承AbstractJavaSamplerClient,并重寫。
pom.xml(jmeter的版本最好和壓測用的一緻)
<!-- jmeter -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.0</version>
</dependency>
1、編寫壓測java腳本:
1)建立java工程,編寫被壓測代碼的”用戶端”:
假設本例需要壓測查詢mysql的效率(jmeter自帶壓測jdbc的功能),寫一個壓測mysql的代碼
public class HelloTest {
public String getMysql() {
String res = "";
String url = "jdbc:mysql://s1h.dbtest3.w.soft.db:8663/_test?"
+ "user=_test&password=123321&useUnicode=true&characterEncoding=UTF8";
try {
Class.forName("com.mysql.jdbc.Driver");// 動态加載mysql驅動
Connection conn = DriverManager.getConnection(url);
Statement stmt = conn.createStatement();
String sql = "select name,brief from author where author_id=200040750";
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out
.println(res = rs.getString(1));// 入如果傳回的是int類型可以用getInt()
}
rs.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return res;
}
public static void main(String... strings) {
HelloTest test = new HelloTest();
test.getMysql();
}
}
2)編寫jmeter測試腳本,繼承AbstractJavaSamplerClient:
public class AppTest extends AbstractJavaSamplerClient {
// 把測試的一些預設資料在程式運作前顯示到JMeter用戶端
@Override
public Arguments getDefaultParameters() {
Arguments params = new Arguments();
params.addArgument("num1", "");
params.addArgument("num2", "");
return params;
}
// 子類用它來 記錄log
protected org.apache.log.Logger getLogger() {
return null;
}
// 初始化方法,實際運作時每個線程僅執行一次,在測試方法運作前執行
public void setupTest(JavaSamplerContext context) {
// 擷取界面中傳遞的值
/*String value1 = context.getParameter("num1");
String value2 = context.getParameter("num2");*/
}
// 測試執行的循環體,根據線程數和循環次數的不同可執行多次
public SampleResult runTest(JavaSamplerContext context) {
SampleResult sampleresult = new SampleResult();
//擷取界面中傳遞的值
String value1 = context.getParameter("num1");
String value2 = context.getParameter("num2");
sampleresult.sampleStart();//計時開始
//測試方法
try {
//MqProductor.sendMessage("liuxiao:"+value1+","+value2);
HelloTest test = new HelloTest();
String sum = test.getMysql();
//将結果寫入結果樹:在jmeter的監聽器-檢視結果樹時即可檢視傳回結果
sampleresult.setResponseData( "結果是:"+sum+","+value1+","+value2 ,null);
sampleresult.setDataType(SampleResult. TEXT);
sampleresult.setSuccessful( true);
} catch (Exception e) {
sampleresult.setSuccessful( false);//不滿足判斷條件則判為false,會出現在監聽器-聚合報告的Error%列
e.printStackTrace();
} finally {
sampleresult.sampleEnd(); //計時結束
}
//判斷測試成功與否的方法:可根據實際進行判斷,此處為如果結果非空,則認為改次調用成功
/*if (a.equals("a")) {
sampleresult.setSuccessful( true);
//将結果寫入結果樹:在jmeter的監聽器-檢視結果樹時即可檢視傳回結果
sampleresult.setResponseData( "結果是:"+a ,null);
sampleresult.setDataType(SampleResult. TEXT);
} else {
sampleresult.setSuccessful( false);//不滿足判斷條件則判為false,會出現在監聽器-聚合報告的Error%列
}*/
return sampleresult;
}
// 結束方法,實際運作時每個線程僅執行一次,在測試方法運作結束後執行
public void teardownTest(JavaSamplerContext context) {
// 擷取界面中傳遞的值
/*String value1 = context.getParameter("key1");
String value2 = context.getParameter("key2");*/
}
// main隻是為了調試用,最後打jar包的時候注釋掉。
public static void main(String[] args) {
Arguments params = new Arguments();
params.addArgument("num1", "1");//設定參數,并賦予預設值1
params.addArgument("num2", "2");//設定參數,并賦予預設值2
JavaSamplerContext arg0 = new JavaSamplerContext(params);
AppTest test = new AppTest();
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
}
}
運作main函數,檢視輸出是否正确。
2、打包
<build>
<finalName>jmeterTest</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering><!--這裡開啟變量替換-->
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
<include>**/*.json</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.5</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.abc.jmeterTest.RpcTest</mainClass>
<classpathPrefix>lib/</classpathPrefix>
<useUniqueVersions>false</useUniqueVersions>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
assembly.xml
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>pack</id>
<!-- SNAPSHOT,Base,Alpha,Beta,RC,Release, LATEST -->
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<scope>runtime</scope>
<outputFileNameMapping>${artifact.artifactId}-${artifact.baseVersion}.${artifact.extension}</outputFileNameMapping>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>target</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>jmeterTest.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>target/classes</directory>
<outputDirectory>conf</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.xml</include>
</includes>
</fileSet>
</fileSets>
</assembly>
1)使用maven,把項目打包成MyTest.jar和lib目錄(依賴的各種jar)
2)将MyTest.jar和lib目錄拷貝到jmeter的JMETER_HOME\lib\ext目錄(因為jmeter運作時需要從ext目錄加載需要的第三方類)
3、壓測:
1)打開jmeter,建立線程組、simple>java請求;

2)壓測:
壓測後,會在結果樹中顯示結果,并且在jmeter的黑屏控制台中把代碼中的system.out資訊輸出。
4、補充:
1)JMeter Java Sampler介紹
Arguments | getDefaultParameters() 用于擷取界面的參數 |
SampleResult | runTest(JavaSamplerContext context) 類似于LR的Action,result.sampleStart()一個事務開始,result.sampleEnd()一個事務 結束 |
void | setupTest(JavaSamplerContext context) 初始化方法,類似于LR的init和Junit中的setUp() |
void | teardownTest(JavaSamplerContext context) 類似于LR的end和Junit中的tearDown() |
執行的先後順序為:
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
常用的方法:
①、addArgument("name", "value") 定義參數
②、sampleStart() 定義事務的開始,類似于LR的lr_start_transaction,和LR一樣事務間不要放無關代碼
③、sampleEnd() 定義事務的結束,類似于LR的lr_end_transaction
④、setSuccessful(true、false) 設定運作結果的成功或失敗,Jmeter統計成功失敗的次數,在聚合報告中能夠展現。
2)自帶Java Request Sampler:
JMeter預設實作了兩個Java Request Sampler:SleepTest Sampler和JavaTest Sampler。
JavaTest Sampler不向伺服器發送資料請求,一般被用作調試目的使用。