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


先定義一下我說的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。


免責聲明!

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



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