- public Arguments getDefaultParameters():設置可用參數及的默認值;
- public void setupTest(JavaSamplerContext arg0):每個線程測試前執行一次,做一些初始化工作;
- public SampleResult runTest(JavaSamplerContext arg0):開始測試,從arg0參數可以獲得參數值;
- public void teardownTest(JavaSamplerContext arg0):測試結束時調用;
getDefaultParameters() --> setupTest(JavaSamplerContext context) --> runTest(JavaSamplerContext context) --> teardownTest(JavaSamplerContext context)
package test; import java.io.File; import java.io.PrintWriter; public class OutputService { public static void output(String filename,int a, int b) throws Exception { PrintWriter out = new PrintWriter(new File(filename)); out.write(a+":"+b); out.close(); } }
測試類: package test; 02. 03. 04. import org.apache.jmeter.config.Arguments; 05. import org.apache.jmeter.protocol.java.sampler.JavaSamplerClient; 06. import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; 07. import org.apache.jmeter.samplers.SampleResult; 08. 09. 10. public class PerformenceTest implements JavaSamplerClient { 11. private SampleResult results; 12. private String a; 13. private String b; 14. private String filename; 15. 16. 17. // 設置傳入的參數,可以設置多個,已設置的參數會顯示到Jmeter的參數列表中 18. public Arguments getDefaultParameters() { 19. Arguments params = new Arguments(); 20. params.addArgument("filename", "0");//設置參數,並賦予默認值0 21. params.addArgument("a", "0");//設置參數,並賦予默認值0 22. params.addArgument("b", "0");//設置參數,並賦予默認值0 23. return params; 24. } 25. 26. 27. // 初始化方法,實際運行時每個線程僅執行一次,在測試方法運行前執行 28. public void setupTest(JavaSamplerContext arg0) { 29. results = new SampleResult(); 30. } 31. 32. 33. // 測試執行的循環體,根據線程數和循環次數的不同可執行多次 34. @Override 35. public SampleResult runTest(JavaSamplerContext arg0) { 36. b = arg0.getParameter("b"); // 獲取在Jmeter中設置的參數值 37. a = arg0.getParameter("a"); // 獲取在Jmeter中設置的參數值 38. filename = arg0.getParameter("filename"); // 獲取在Jmeter中設置的參數值 39. results.sampleStart();// jmeter 開始統計響應時間標記 40. try { 41. OutputService test = new OutputService(); 42. test.output(filename,Integer.parseInt(a), Integer.parseInt(b)); 43. results.setSuccessful(true); 44. // 被測對象調用 45. } catch (Throwable e) { 46. results.setSuccessful(false); 47. e.printStackTrace(); 48. } finally { 49. results.sampleEnd();// jmeter 結束統計響應時間標記 50. } 51. return results; 52. } 53. 54. 55. // 結束方法,實際運行時每個線程僅執行一次,在測試方法運行結束后執行 56. public void teardownTest(JavaSamplerContext arg0) { 57. } 58. public static void main(String[] args) { 59. // TODO Auto-generated method stub 60. Arguments params = new Arguments(); 61. params.addArgument("a", "0");//設置參數,並賦予默認值0 62. params.addArgument("b", "0");//設置參數,並賦予默認值0 63. JavaSamplerContext arg0 = new JavaSamplerContext(params); 64. PerformenceTest test = new PerformenceTest(); 65. test.setupTest(arg0); 66. test.runTest(arg0); 67. test.teardownTest(arg0); 68. } 69. }
Export 為 Runnable Jar File;
2、設置JMeter
以管理員身份打開JMeter,並創建Java Request后,結構如下圖所示:
查看聚合報告,分析其中的所有統計數據,得出性能測試結論。
如果做Web應用的性能測試,例如只有一個登錄的請求,那么在Aggregate Report中,會顯示一行數據,共有10個字段,含義分別如下。
Label:每個 JMeter 的 element(例如 HTTP Request)都有一個 Name 屬性,這里顯示的就是 Name 屬性的值
Samples:表示你這次測試中一共發出了多少個請求,如果模擬10個用戶,每個用戶迭代10次,那么這里顯示100
Average:平均響應時間——默認情況下是單個 Request 的平均響應時間,當使用了 Transaction Controller 時,也可以以Transaction 為單位顯示平均響應時間
Median:中位數,也就是 50% 用戶的響應時間
90% Line:將所有響應時間從小到大排列,第90%的那個響應時間,此數值代表絕大多數用戶的響應實際時間,有一定參考價值
Min:最小響應時間
Max:最大響應時間
Error%:本次測試中出現錯誤的請求的數量/請求的總數
Throughput:吞吐量——默認情況下表示每秒完成的請求數(Request per Second)
KB/Sec:每秒從服務器端接收到的數據量,相當於Throughput/Sec
6.1監控插件
很多時候,測試性能都需要查看內存和CPU等信息來判斷系統瓶頸,關於CPU和內存的監控,Jmeter並沒有很好的支持,只能通過系統的資源監控器來觀察,一閃而過不會記錄下來。谷歌開發了一款專門監控的Jmeter插件JMeterPlugins,彌補了這方面的不足,目前使用的版本為JMeterPlugins-Standard-1.2.0。
首先將下載的文件進行解壓,得到JMeterPlugins-Standard-1.2.0與ServerAgent,將JMeterPlugins-Standard-1.2.0\lib\ext\JMeterPlugins-Standard.jar包復制到JMeter的lib目錄下面的ext目錄下面,重新啟動Jmeter。
然后,將serverAgent目錄及下面的文件復制到我們測試的服務器上,windows的話運行startAgent.bat,linux的話打運行startAgent.sh。
准備工作完成,開始進行性能測試。
6.2分布式測試
有時一台壓力測試機無法滿足性能測試的需求的情況下,需要搭建分布式的Jmeter測試系統,使用Jmeter自帶分布式的性能測試功能。
首先開始分布式性能測試之前:
1 所有的壓力機的防火牆應該關閉
2 所有的壓力機應該都在同一個局域網中
3 確保所有壓力機的JMeter可以訪問待測服務器
4 確保所有壓力機的JMeter版本都是一致的
\bin\jmeter-server.bat
2 性能測試主機進入Jmeter主界面,並且啟用遠程控制
可以選擇啟動某個附屬壓力機,也可以選擇全部啟動,通過遠程啟動,便可驅動遠程開啟的JMeter同時進行並發測試,這樣實現了分布式的性能測試。測試過程中附屬壓力機的處理器和內存可能全部占滿,需要監控壓力機的硬件資源防止其崩潰死機,測試結束之后再點擊遠程全部停止,關閉附屬壓力機。