前言
JMeter為用戶提供了AbstractJavaSamplerClient擴(kuò)展類栋荸。用戶只需繼承該類,并重寫相關(guān)的方法,理論上可以自定義任何請求的sampler蒸其。
參考資料:AbstractJavaSamplerClient(Apache JMeter API)
摘要
編寫一個基于AbstractJavaSamplerClient擴(kuò)展類的Java Sampler 敏释,需要依賴5個來自JMeter接口:
Arguments ,
AbstractJavaSamplerClient摸袁,
JavaSamplerContext钥顽,
SampleResult,
JavaSamplerClient
AbstractJavaSamplerClient 接口
這是一個JavaSamplerClient接口的抽象類靠汁,以簡化實(shí)現(xiàn)JavaSamplerClient接口功能的開發(fā)工作蜂大。在JavaSamplerClient接口中聲明的的runTest()方法沒有寫邏輯,因此要想實(shí)現(xiàn)自定義的java請求蝶怔,必須要在AbstractJavaSamplerClient類上對runTest()方法加入運(yùn)行邏輯奶浦。為滿足測試需求,必要時改寫其他方法也很有幫助踢星,涉及其他3個方法:getDefaultParameters()澳叉、setupTest(),teardownTest()沐悦。
getDefaultParameters():用于設(shè)置傳入的參數(shù)成洗,可以設(shè)置多個,已設(shè)置的參數(shù)會顯示到Java Sampler組件的請求參數(shù)列表中藏否;
setupTest():初始化方法瓶殃,用于初始化性能測試時的每個線程,實(shí)際運(yùn)行時每個線程僅執(zhí)行一次副签;
runTest():從JavaSamplerClient類繼承的方法遥椿,性能測試時的線程執(zhí)行的循環(huán)體,循環(huán)次數(shù)受所在線程組的設(shè)置決定淆储,每次迭代此方法返回一個SampleResult對象冠场;
teardownTest():從JavaSamplerClient類繼承的方法,測試結(jié)束方法遏考,用于結(jié)束性能測試中的每個線程慈鸠,實(shí)際運(yùn)行時蓝谨,每個線程僅執(zhí)行一次灌具。
JavaSamplerClient 接口
這個接口定義了JavaSampler和外部Java程序之間的交互,任何希望作為JMeter測試執(zhí)行的Java類都可以引用這個接口或間通過AbstractJavaSamplerClient類譬巫。 Java測試應(yīng)該擴(kuò)展AbstractJavaSamplerClient類咖楣,而不是直接實(shí)現(xiàn)JavaSamplerClient類,以免將來JavaSamplerClient接口被官方更改芦昔。
JMeter會為測試執(zhí)行中的每個用戶/線程創(chuàng)建一個JavaSamplerClient實(shí)例诱贿,供JMeter內(nèi)部使用。當(dāng)JMeter測試腳本啟動時,將在每個線程的JavaSamplerClient實(shí)例上調(diào)用setupTest()方法來進(jìn)行初始化工作珠十,然后每個迭代調(diào)用runTest()方法料扰,最后調(diào)用teardownTest()進(jìn)行任何必要的清理。
通過getDefaultParameters()方法定義默認(rèn)參數(shù)列表中的參數(shù)和與這些參數(shù)相關(guān)聯(lián)的任何默認(rèn)值焙蹭,都將顯示在JMeter JavaSampler GUI中晒杈,并通過Java Sampler上下文傳遞給各種測試方法。
接口下常用方法:getDefaultParameters()孔厉、setupTest()拯钻、runTest(),teardownTest()撰豺。
JavaSamplerClient類源碼:
package org.apache.jmeter.protocol.java.sampler;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.samplers.SampleResult;
public interface JavaSamplerClient {
void setupTest(JavaSamplerContext var1);
SampleResult runTest(JavaSamplerContext var1);
void teardownTest(JavaSamplerContext var1);
Arguments getDefaultParameters();
}
SampleResult 接口
該接口封裝了處理JMeter測試執(zhí)行過程中各種返回信息的功能粪般,
SampleResult有許多可以使用的字段,測試腳本至少應(yīng)使用SampleResult.sampleStart和SampleResult.sampleEnd設(shè)置測試執(zhí)行開始和結(jié)束時間污桦,通過sampleLabel設(shè)置事務(wù)名亩歹,通過successful設(shè)置成功標(biāo)志。
常用方法:凡橱,setResponseData() 捆憎,setDataType(SampleResult.TEXT), SampleResult.sampleStart() 梭纹, SampleResult.sampleEnd()躲惰,SampleResult.setSuccessful(boolean),SampleResult.setSampleLabel(String) 变抽。
更多詳情點(diǎn)擊 SampleResult 了解础拨。
Arguments 接口
該接口提供了一系列對參數(shù)對象進(jìn)行操作的方法。
常用方法有addArgument()绍载,getParameter()诡宗,更多詳細(xì)描述點(diǎn)擊Arguments 。
Arguments類源碼:
該接口提供了一系列對參數(shù)對象進(jìn)行操作的方法击儡。
常用方法有addArgument()塔沃,getParameter(),更多詳細(xì)描述點(diǎn)擊Arguments 阳谍。
實(shí)例
把java 腳本打成jar包拷貝到JMeter的安裝目錄lib/ext下蛀柴,啟動JMeter即可通過Java Sampler使用,下圖為一個java sampler的實(shí)例矫夯,在請求參數(shù)中按測試需求填寫參數(shù)后鸽疾,用法與JMeter常規(guī)的sampler一樣。
參考模板
引入依賴:
<!-- JMeter Dependencies -->
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_core</artifactId>
<version>3.3</version>
</dependency>
<dependency>
<groupId>org.apache.jmeter</groupId>
<artifactId>ApacheJMeter_java</artifactId>
<version>3.3</version>
</dependency>
實(shí)例參考模板:
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 Test extends AbstractJavaSamplerClient {
// SampleResult類封裝了從入口樣本返回的各種信息
private SampleResult results;
private static long start = 0;
private static long end = 0;
//定義參數(shù)
private String request;
private String response;
/** 自定義java方法入?yún)⒓澳J(rèn)值训貌。 */
public Arguments getDefaultParameters() {
Arguments params = new Arguments(); // 聲明定義對象名為params的Arguments類
params.addArgument("request", ""); // 新增一個名為request的參數(shù)
return params;
}
/** 每個線程執(zhí)行前制肮,進(jìn)行一次初始化冒窍。 */
public void setupTest(JavaSamplerContext jsc) {
inNum = jsc.getParameter("request"); // 以String形式獲取指定參數(shù)的值,或者如果未指定該值豺鼻,則返回指定的默認(rèn)值
}
/** 定義循環(huán)執(zhí)行的壓測功能综液。 */
public SampleResult runTest(JavaSamplerContext jsc) {
SampleResult result = new SampleResult(); // 定義SampleResult類
results.sampleStart(); // 開始計時
{
... //滿足測試需求的執(zhí)行邏輯
}
result.setSamplerData("Request : " + this.request, "utf-8"); //結(jié)果樹中展示請求報文
result.setResponseData("Response : " + this.response, "utf-8"); //結(jié)果樹中展示響應(yīng)報文
return result;
}
// 測試結(jié)束方法,用于結(jié)束性能測試中的每個線程儒飒,實(shí)際運(yùn)行時意乓,每個線程僅執(zhí)行一次,在測試方法運(yùn)行結(jié)束后執(zhí)行
public void teardownTest(JavaSamplerContext jsc) {
results.sampleEnd(); // 結(jié)束計時
super.teardownTest(jsc);
}
//可以添加main(String[] args)方法约素,在本地調(diào)試無誤后届良,再把代碼打成jar包放入JMeter的安裝目錄lib/ext下
}