【轉】JMeter完成一個java請求的壓測


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、查看結果樹,進行測試;

一 創建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(注意:這里到處的是 runnable Jar,這樣的話依賴的類也可以打進去。強調下:雖然必須有main方法,但實際在jmeter執行過程中  main方法不執行
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。
問題7:如何打印日志調試
重寫getLogger方法,如:
 public org.apache.log.Logger getLogger()
	{  return super.getLogger();  }
使用:
this.getLogger().info(">>>>>>>>>> runTest() >>>>>>>>>>");這樣就可以在jmeter日志里邊打印出相關日志信息,見下圖:
 
         
問題8:定義Jmeter結果 results.setSuccessful(true)
		SampleResult results=new SampleResult();
		results.setSampleLabel("Test2222");
		results.sampleStart();
		results.setSuccessful(true);
		results.sampleEnd(); 
如果沒有設置results.setSuccessful() 默認執行結果是錯誤Error,所以這個可以更具邏輯判斷來輸出結果是正確或錯誤
問題9: 每次導出新的jar后,jmeter需要關閉后重新打開。
		SampleResult results=new SampleResult();
		results.setSampleLabel("Test2222");
		results.sampleStart();
		results.setSuccessful(true);
		results.sampleEnd(); 
如果沒有設置results.setSuccessful() 默認執行結果是錯誤Error,所以這個可以更具邏輯判斷來輸出結果是正確或錯誤,見下圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM