先定義一下我說的remoteService:即遠程調用服務,沒有http的url。不對外提供或者對外提供有限的服務。具體視各公司的代碼架構所定,比如有些公司為web工程,scf服務,db。scf即為服務通訊框架(Service Communication Framework)該層結構,或者一些單獨的lib包,里面集成了某些方法
對於有url的http請求,我們可以用jmeter的http請求進行壓測,或者使用Apache-AB等進行測試,這種也可以用JMeter進行壓力測試,具體操作如下
核心步驟
1.創建一個Java工程;
2.將JMeter的lib目錄下的jar文件添加進此工程的Build Path;
3.創建一個類並實現JavaSamplerClient接口或繼承AbstractJavaSamplerClient,並重寫;
public Arguments getDefaultParameters();設置可用參數及的默認值; public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作; public SampleResult runTest(JavaSamplerContext arg0):開始測試,從arg0參數可以獲得參數值; public void teardownTest(JavaSamplerContext arg0):測試結束時調用;
4.Export為Runnable Jar File;
5.將此jar包放入JMETER_HOME\lib\ext目錄;
6.以管理員身份打開JMeter;
7.創建線程組、Java Request、查看結果樹,進行測試;
一 創建java工程並實現JavaSamplerClient的重寫
1新建一個Maven項目:File->new->Other->Maven Project
2 Next->Creat a simple project,使用Defaut路徑->Next->Enter a group id for the artifact->填入Group Id 與package,此處與需要測試的RemoteService保持一致
3 在Eclipse下導入$\jmeter\lib\ext\下的所有jar包;導入額外的5個jar包,在$\jmeter\lib\ 下
4 創建對應的Source Folder:src/main/java 和 src/main/resource
src/main/java 編寫代碼
src/main/resource 放配置文件(也可放在目錄外,scf.config,此時打包放入jmeter使用時,配置文件在bin目錄下,獨立開來的)
成品圖如下
or
5、創建class: JMeterSCFTest 將新建的類extends AbstractJavaSamplerClient 類。
繼承"getDefaultParameters","setupTest","runTest"和"teardownTest"四個方法
public Arguments getDefaultParameters();設置可用參數及的默認值; public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作; public SampleResult runTest(JavaSamplerContext arg0):開始測試,從arg0參數可以獲得參數值; public void teardownTest(JavaSamplerContext arg0):測試結束時調用;
幾個方法都是什么意思呢:
1)、getDefaultParameters: 獲取默認參數以及參數值
@Override public Arguments getDefaultParameters(){ Arguments params = new Arguments(); params.addArgument( "localPath", "1"); params.addArgument( "catePath", "9224,13901"); params.addArgument( "pn", "1"); params.addArgument( "platform", "-1"); params.addArgument( "referer", "referer"); params.addArgument( "userAgent", "userAgent"); params.addArgument( "ip", "1.1.1.1");
return params; }
2)、setupTest: 測試方法運行之前的工作(初始化記錄結果;從參數列表中獲取對應變)
@Override public void setupTest(JavaSamplerContext arg0){ results = new SampleResult(); localPath = arg0.getParameter( "localPath"); catePath = arg0.getParameter( "catePath"); pn = Integer. parseInt(arg0.getParameter("pn")); platform = Integer. parseInt(arg0.getParameter("platform")); referer = arg0.getParameter( "referer"); userAgent = arg0.getParameter( "userAgent"); ip = arg0.getParameter( "ip"); }
3)、runTest:運行測試方法(初始化記錄結果,設定開始/結束記錄時間,測試調用Service的主方法,測試成功與否的判斷方法)
public SampleResult runTest(JavaSamplerContext arg0){ results = new SampleResult();//初始化記錄結果 results.sampleStart();//計時開始 /*測試方法*/此處寫自己的測試方法進行調用 List<MingQiInfo> mingQiInfos = scf.loadMingQiInfo( localPath, catePath, pn, platform, referer, userAgent, ip); results.sampleEnd();//計時結束 //判斷測試成功與否的方法:可根據實際進行判斷,此處為如果結果非空,則認為改次調用成功 if (mingQiInfos!= null) { results.setSuccessful( true); for(MingQiInfo sssInfo :mingQiInfos){ //將結果寫入結果樹:在jmeter的監聽器-查看結果樹時即可查看返回結果 resultData += String. valueOf(sssInfo.toString()); } results.setResponseData( "結果是:"+resultData ,null); results.setDataType(SampleResult. TEXT); } else { results.setSuccessful( false);//不滿足判斷條件則判為false,會出現在監聽器-聚合報告的Error%列 } return results; }
4)、tearDownTest:測試結束后的操作(這里什么也不做)
5)、其他參數:
//定義全局變量
private
String
resultData
; //寫入結果樹時使用
private
SampleResult
results
;
public
BrandMingQiTopService scf
= TcpProvider.getInstance().BMQSCF
;
//調用remoteService的方法
//提供給jmeter的對外參數,可修改
String
localPath
;
String catePath;
int pn ;
int platform ;
String referer;
String userAgent;
String
ip
;
二 、打包,導出
1、右鍵點擊項目:Export…
2、選擇Java -> Runnable JAR file
3、在Launch configuration選擇debug –【項目名稱】
PS1:如果沒有該選項可選:則執行一遍Run As-> Java Application 就有了。
PS2:如果沒有main方法不能Run那么寫一個和MySampleTest同級的class 放一個main函數進去調用一下剛剛寫的MySampleTest這個類。然后Run As -> Java Application就好了,
public
class
debug {
public
static
void
main(String[] args) {
jmtertest test =
new
jmtertest();
JavaSamplerContext arg0 =
new
JavaSamplerContext(test.getDefaultParameters());
test.setupTest(arg0);
test.runTest(arg0);
test.teardownTest(arg0);
System. exit(0);
}
4、export后的jar包放在$/jmeter/lib/ext/下
四、運行Jmeter
1、在$\jmeter\bin\下執行jmeter.bat
2、右鍵點擊“測試計划”添加一個Thread Group(線程組)
3、右鍵點擊線程組,添加一個Java Request
4、點擊該Java Request,可以看到之前我們新建的類MySampleTest
5、設定參數,雙擊可修改
6、右鍵線程組,添加一個聚合報告
7、Ctrl+R運行測試計划,在聚合報告查看性能。
五 可能出現的問題:
問題1: 啟動jmeter內存溢出:提示 An error occurred: PermGen space
Uncaught Exception
java.lang.OutOfMemoryError: PermGen space. See log file for details.
更改內存設置,linux環境,修改jmeter.sh;windows環境,更改jmeter.bat文件,增大配置內存: set HEAP=-Xmx1024m -Xms512m -Xmn256m -Xss128k //如果值太大,則jmeter會打不開,同時會有提示;值太小則有OutOfMemory的錯誤 set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m -XX:+CMSClassUnloadingEnabled
問題2:監聽器添加了聚合報告/查看結果樹兩個,測試結果特別不穩定。
‘View Result Tree’-查看結果樹 在debug的時候非常的好用,但是也很占內存。所以在跑性能測試的時候還是不要用的為好。
1 占用內存:本來跑30分鍾不到就有OutOfMemory的錯誤,把 ‘View Result Tree’ 這個listener刪掉后,就再也沒有出現
2 影響聚合報告的結果:寫結果樹占用時間和資源
問題3:執行debug程序時報錯
檢查下jmeter是否為中文路徑,如果有,統一改成英文路徑
問題4:配置文件獲取不到或者失敗,無法初始化
注意:在寫初始化方法時,注意配置文件最好寫成絕對路徑;寫成相對路徑時,需要把配置放到jmeter對應的路徑下。我比較習慣用相對路徑“System.getProperty("user.dir")”,就需要把配置放到/jmeter/bin里面去。
問題5:調試一個問題時,我打印了初始化日志,發現每次鼠標點擊“java請求”,都會初始化4次
初始化4次的解釋:4個jmeter重載的函數,runTest setupTest getArgument tearDown,每個都會去初始化一次。 每次點擊"java請求"都做初始化:是因為我在定義全局變量建立tcp連接時沒有定義為"public static".
修改后解決。
問題6:非string型的變量怎么添加到參數里?
我定義了一個全局變量:int count; 在setupTest方法里設置“count = arg0.getParameter("count");”時提示 change type of 'count' to 'string' 解決辦法:arg0.可以聯想出來getIntParameter和getLongParameter用以添加不同的數據類型,count = arg0.getIntParameter("count"); 即 ok。
