JMeter完成java請求的壓力測試詳解以及問題總結
原文地址:http://www.cnblogs.com/zhaoxd07/p/4895224.html 作者:KK_Yolanda
這篇文章已經寫得比較全面了,所以轉載下,自己懶得總結了, 只對部分做了修改。
先定義一下我說的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、查看結果樹,進行測試;






public Arguments getDefaultParameters();設置可用參數及的默認值;
public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作; public SampleResult runTest(JavaSamplerContext arg0):開始測試,從arg0參數可以獲得參數值,執行多次依賴於設置方式; public void teardownTest(JavaSamplerContext arg0):測試結束時調用,只執行一次;
@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; }
@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"); }
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:測試結束后的操作(這里什么也不做)



更改內存設置,linux環境,修改jmeter.sh;windows環境,更改jmeter.bat文件,增大配置內存:
set HEAP=-Xmx1024m -Xms512m -Xmn256m -Xss128k //如果值太大,則jmeter會打不開,同時會有提示;值太小則有OutOfMemory的錯誤 set PERM=-XX:PermSize=64m -XX:MaxPermSize=128m -XX:+CMSClassUnloadingEnabled
‘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". 修改后解決。
我定義了一個全局變量:int count; 在setupTest方法里設置“count = arg0.getParameter("count");”時提示 change type of 'count' to 'string' 解決辦法:arg0.可以聯想出來getIntParameter和getLongParameter用以添加不同的數據類型,count = arg0.getIntParameter("count"); 即 ok。
重寫getLogger方法,如: public org.apache.log.Logger getLogger() { return super.getLogger(); }
使用:
this.getLogger().info(">>>>>>>>>> runTest() >>>>>>>>>>");這樣就可以在jmeter日志里邊打印出相關日志信息,見下圖:
SampleResult results=new SampleResult();
results.setSampleLabel("Test2222");
results.sampleStart();
results.setSuccessful(true);
results.sampleEnd();
如果沒有設置results.setSuccessful() 默認執行結果是錯誤Error,所以這個可以更具邏輯判斷來輸出結果是正確或錯誤
SampleResult results=new SampleResult();
results.setSampleLabel("Test2222");
results.sampleStart();
results.setSuccessful(true);
results.sampleEnd();
如果沒有設置results.setSuccessful() 默認執行結果是錯誤Error,所以這個可以更具邏輯判斷來輸出結果是正確或錯誤,見下圖