JMeter是Apache組織的開放源代碼項目,它是功能和性能測試的工具,100%的用java實現,最新的版本是2.9,你們能夠到官網下載源代碼和查看相關文檔。以前本科的時候,SQA課程做業中咱們組使用過2.4版本,此次更新了2.9感受最直觀的就是界面上有了小的更改,增長了清除、啓動等按鈕。html
關於使用JMeter進行JDBC數據庫測試、HTTP請求接口測試、結合Badboy錄製功能進行網站性能測試等內容,網上的資料比較豐富,這裏就暫時不作介紹了。更實用和靈活的場景,是實用咱們本身編寫的jar包進行測試,這也就是「Java請求」方式的測試。這裏主要記錄一下我在學習這種測試方式時遇到的一些問題,和整體流程,算做一個記錄和小總結。java
1. JMeter安裝數據庫
準確的來講,我認爲JMeter是不須要安裝的,下載好JMeter Binary版本後,在本地解壓縮,進入bin文件夾,執行ApacheJMeter.jar文件便可。這裏提供一個觀望的2.9版本的下載連接,時間久了可能會失效,這個時候能夠進入Apache JMeter項目主頁再選擇download頁面。apache
打開JMeter程序後,咱們能夠看到JMeter的主界面,是下圖的這個樣子(2.9版本)。swift
2. 使用JMeter建立測試計劃服務器
若是咱們但願實用JMeter進行性能測試,則首先須要建立一個測試計劃,咱們能夠對測試計劃進行保存,這樣當咱們下一次須要再次執行這個測試的時候,只須要打開已保存的測試計劃文件(.jmx文件)就能夠執行了,無需再次建立。多線程
1)點擊「測試計劃」,在右側輸入框中能夠修改測試計劃的名稱,並添加註釋,這裏我偷個懶就不改了,使用默認的。併發
2)爲測試計劃添加一組Threads,選擇線程組。這組Threads就至關因而一組用戶,每一個顯示錶明一個用戶執行相關操做。框架
3) 編輯線程組屬性。設置響應內容,比較重要的是線程數、ramp-up period和循環次數。這裏設置線程數爲一、ramp-up period爲1和循環次數1,即線程組中只有1個線程,這個線程在計劃啓動後1秒就開始執行,只執行1次。dom
圖上的ramp-up period解釋不正確,這個屬性表示每一個用戶(線程)啓動的遲延時間。例如,若是你輸入Ramp-Up Period 爲5秒,JMeter將會在五秒結束前完成啓動全部的用戶。因此,若是你有五個用戶而且Ramp-Up Period爲5秒,那麼開始用戶的延遲就是1秒。(5個用戶/5秒=1用戶每秒)。若是你設置的Ramp-Up Period爲0,則JMeter將會當即啓動你全部的用戶。
若是勾選了「調度器」,則能夠定時啓動線程。
4)爲線程組添加Sampler取樣器,取樣器代表這組線程執行測試的類型,即發送請求的類型、怎樣發送請求的。咱們這裏選擇「Java請求」,代表這組線程是經過某個Java類發送請求的。
4)編輯「Java請求」屬性。下圖這個你們能夠發現已經有了Launcher類,和userName、password、authUrl的值了,這是由於:1. 我以前寫了知足必定要求的代碼,打了jar包,放入了JMeter的lib/ext文件夾下了,因此能夠看到Launcher;2. 我在Launcher類中的getDefaultParameters方法中添加了默認的userName、password、authUrl值。這裏的「知足必定要求」請繼續參閱下文。
5)爲Java請求添加監聽器,選擇「聚合報表」和「圖形結果」,這樣在啓動測試後,咱們就能夠得到測試結果的數據,分別以報表和圖形的結果展現。
6)點擊啓動(菜單欄中的綠色三角形按鈕)。測試完成能夠看到測試結果。爲告終果好看一點,我把線程數改爲了10,循環改爲了100 :P
這裏對測試結果中的幾個指標進行說明:
樣本數目 | 總共發送到服務器的請求數。 |
最新樣本 | 表明時間的數字,是服務器響應最後一個請求的時間。 |
吞吐量 | 服務器每分鐘處理的請求數。 |
平均值 | 是總運行時間除以發送到服務器的請求數,即每一個請求的平均響應時間。 |
中間值 | 是表明時間的數字,有一半的服務器響應時間低於該值而另外一半高於該值。 |
偏離 | 表示服務器響應時間變化、離散程度測量值的大小,即數據的分佈。 |
90%line | 90%的響應時間都比這個時間小 |
Min | 表明時間的數字,是服務器響應的最短期。 |
Max | 表明時間的數字,是服務器響應的最長時間。 |
Error% | 請求的錯誤百分比。 |
KB/sec | 是每秒鐘請求的字節數。 |
3. 實現「Java請求」代碼
針對"Java請求"類型的測試,須要基於JMeter測試框架編寫測試用例。
1)新建一個普通的Java工程
2)添加JMeter的包引用,這些包位於 JMeter安裝目錄/lib/ext下,通常只須要ApacheJMeter_core.jar和ApacheJMeter_java.jar這兩個。
3)新建一個Java Class,以下例中的「Launcher」,並繼承「AbstractJavaSamplerClient」。AbstractJavaSamplerClient中默認實現了四個能夠覆蓋的方法,分別是「getDefaultParameters」,「setupTest」,「runTest」和「teardownTest」方法。
package cn.edu.zju.swift.test; import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient; import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext; import org.apache.jmeter.samplers.SampleResult; import cn.edu.zju.swift.JtangSwiftClient; import cn.edu.zju.swift.model.result.AccountResult; public class Launcher extends AbstractJavaSamplerClient{ private JtangSwiftClient client; @Override /** * JMeter界面中展現出此方法所設置的默認參數。 * @return */ public Arguments getDefaultParameters() { Arguments args = new Arguments(); args.addArgument("authUrl", "http://192.168.3.51:8080/auth/v1.0"); args.addArgument("userName", "test:tester"); args.addArgument("password", "testing"); return args; } /** * 執行runTest()方法前會調用此方法,可放一些初始化代碼 */ @Override public void setupTest(JavaSamplerContext context) { // 建立SwiftClient this.client = new JtangSwiftClient(15000, 15000, 8192, true, false); } /** * 執行runTest()方法後會調用此方法,可放一些資源釋放代碼 */ @Override public void teardownTest(JavaSamplerContext context) { // 關閉鏈接 this.client.close(); } @Override /** * 性能測試時的線程運行體,執行的業務方法放在這裏。 */ public SampleResult runTest(JavaSamplerContext context) { // 建立SampleResult對象,用於記錄執行結果的狀態,並返回 SampleResult sampleResult = new SampleResult(); // 獲取JMeter中輸入的用戶參數 String authUrl = context.getParameter("authUrl"); String userName = context.getParameter("userName"); String password = context.getParameter("password"); // 開始 sampleResult.sampleStart(); AccountResult accountResult = client.auth(authUrl, userName, password); // 暫停 // sampleResult.samplePause(); // 重啓 // sampleResult.sampleResume(); // 結束 sampleResult.sampleEnd(); sampleResult.setSuccessful(accountResult.isSuccess()); // 返回 return sampleResult; } }
4)代碼編寫完畢後,把上面的例子打包(使用eclipse右鍵項目 -> export -> jar,便可)。而後把生成的"swift-random-action-test.jar"文件拷貝到JMeter的安裝目錄lib\ext下,就能夠在上述「2. 使用JMeter建立測試計劃」的4)Java請求編輯頁面的下拉列表中看到Launcher類了。
這裏有兩點須要注意:
1. 若是你的jar依賴了其餘第三方jar,須要將其一塊兒放到lib/ext下,不然會出現ClassNotFound錯誤,這個問題也是困擾了我很久的 T^T;
2. 若是在將jar放入lib/ext後,你仍是沒法找到你編寫的類,且此時你是開着JMeter的,則須要重啓一下JMeter。
以上就是使用JMeter的Java請求方式進行一個測試計劃構建的全過程了,都是比較基礎的方法,若是須要什麼額外的功能還能夠慢慢學習。雖然本身也有寫多線程併發的客戶端測試代碼,並本身收集response time等,計算TPS,但顯然使用JMeter的方式更加方便,由於你只須要按照單線程的方式去實現你的測試業務,也無需添加各類埋點收集數據。
綜上,感受JMeter仍是很強大的,最近打算多學習一點,對之後寫代碼,自我測試性能也是頗有幫助的,再配合jProfiler的使用,能夠很好的保證Java代碼的效率和性能。固然,工具只能「錦上添花」,最根本的仍是須要咱們本身能夠編寫出高質量的代碼啦 :D