工具:Jmeter4.0 + Java1.8
需求:對某https網站進行 登錄-修改信息-退出 場景的壓力測試
方法:使用Apache JMeter HTTP(S) Test Script Recorder(即http代理服務器)錄制https請求
原理:
實踐:
一 Jmeter配置
從JMeter 2.10開始,錄制功能已得到改進,可以更好地處理嵌入式資源並動態創建證書。JMeter使用keytool程序(在JRE / JDK中可用)來支持這些功能,因此您需要確保配置正確。在啟動Jmeter之前,請查看並確認以下問題:
問題1:啟動Recorder時出現問題,如下所示:
ERROR - jmeter.protocol.http.proxy.ProxyControl: Could not initialise key store java.io.IOException: Cannot run program "keytool" (in directory "C:\apache-jmeter-2.10\bin"): CreateProcess error=2, The system cannot find the file specified
原因:這意味着在PATH上找不到“keytool”應用程序。
解決:確保PATH包含正確的Java安裝的bin目錄。如果在安裝Java時未正確設置環境變量,則可能需要更新啟動JMeter的腳本。
例如,將以下內容添加到jmeter.bat(Windows)
set JAVA_HOME=<path to JDK> rem for example set JAVA_HOME=C:\jdk1.7.0_45 set PATH=%JAVA_HOME%\bin;%PATH%
類似地,對於Unix,更新腳本“jmeter”或“jmeter.sh”:
JAVA_HOME=<PATH TO JDK> # for example JAVA_HOME=/usr/java170 export JAVA_HOME PATH=$JAVA_HOME/bin:$PATH export PATH
注意:如果安裝了新版本的Java,幾乎可以肯定java路徑一定變了,因此一定不要忘記修改環境變量。
問題2:如下所示
Could not create script recording proxy - see log for details:
Command :'"C:\Program Files\Java\jre7\bin\keytool" -genkeypair -alias :root_ca: -dname "CN=_ DO NOT INSTALL unless this is your certificate (JMeter root CA),
OU=Username: user, C=US" -keyalg RSA -keystore proxyserver.jks -storepass {redacted) -keypass {redacted) -validity 7 -ext bc:c' failed, code: 1 keytool error: java.io.FileNotFoundException: proxyserver.jks (Access is denied)
原因:JMeter bin目錄不可寫,因為JMeter默認在bin目錄中創建密鑰庫。
解決:在jmeter.properties中定義屬性告訴JMeter在哪里創建密鑰庫。如下所示
proxy.cert.directory=<JMeter bin directory>
參考:https://wiki.apache.org/jmeter/TestRecording210
二 基本步驟
1.進入JMETER_HOME / bin目錄,點擊jmeter.bat啟動Jmeter。
2.在菜單欄上選擇模板,在列表中選擇錄制模板,生成完整的測試計划。
3.在HTTP Request Defaults中輸入,協議:https,服務器名稱或IP:test.com,端口號:443,路徑:留着空白。
這樣做可以過濾掉很多不必要的請求。
4.在User Defined Variables中定義以后可能需要參數化的變量,比如username=xiaoming,password=123456。
這樣做的好處是,接下來當你開始錄制請求時,所有的請求中只要包含參數值為xiaoming和123456,均會被${username}和${password}代替,方便錄制結束后進行參數化。
5.在HTTP(S) Test Script Recorder中,點擊“啟動”按鈕。這將啟動JMeter代理服務器,用於攔截瀏覽器請求。並首先將在JMETER_HOME / bin文件夾中生成名為ApacheJMeterTemporaryRootCA.crt的文件。證書生成可能需要一段時間,在此期間GUI將無響應。證書生成完成后,GUI將顯示一個彈出對話框,其中包含根CA的證書詳細信息。該證書需要由瀏覽器安裝,以便它接受JMeter生成的主機證書。注意:該證書有效期7天。
6.瀏覽器導入證書並設置代理。
打開Firefox瀏覽器-->工具-->選項-->搜索“證書”-->查看證書-->在證書頒發機構一欄,點擊“導入”-->選擇Jmeter/bin目錄下的ApacheJMeterTemporaryRootCA.crt文件,點擊“打開”-->勾選“信任由此證書頒發機構來標識網站”,點擊“確定”-->回到證書管理器,在證書頒發機構一欄,可看到此證書存在於列表中,點擊“確定”,證書導入完成。
接着,搜索“代理”-->點擊“設置”-->選擇“手動代理配置”,http代理輸入localhost,端口輸入8888(與Jmeter代理服務器端口一致),勾選“為所有協議使用相同代理服務器”,點擊“確定”,代理設置完成。
注意:測試完成之后記得要把代理設置修改回來,否則會無法上網。
7.Jmeter設置SSL。回到Jmeter-->點擊“ok”,證書彈窗消失-->點擊“選項”-->點擊“SSL管理器”-->選擇Jmeter/bin目錄下的ApacheJMeterTemporaryRootCA.crt文件,點擊“打開”。
8.錄制請求。回到瀏覽器界面,在在頂部的地址欄中輸入http://test.com/index.html(將test.com替換為您的網站地址)。並按Enter鍵。進行登錄-修改信息(初始化-編輯-保存)-退出等一系列場景操作,完成之后,關閉Jmeter代理服務器,結束錄制。
注意:開始錄制時,Jmeter可能會彈出輸入KeyStore Password密碼提示,默認密碼是password,輸入后就能錄制了。
9.在Jmeter中,根據實際情況,配置線程屬性,添加CSV數據文件設置,.添加集合點,添加動態關聯,添加監聽器等。
注意:為了進行關聯,我們可以使用正則表達式提取器,JSON Extractor等后置處理器從請求中獲取數據,並將其注入另一個請求中。要查找要關聯的數據,最簡單的方法是使用“查看結果樹”中的“搜索”功能。
10.在運行測試計划之前驗證腳本(右鍵單擊Thread Group-->點擊),保存測試計划(千萬千萬別忘記保存測試計划喲)。
11.開始運行測試。建議調試階段使用GUI,使用非GUI(命令行)進行負載測試。使用以下命令,在測試結束時,將生成一個HTML報告。
jmeter -n -t [jmx文件] -l [結果文件] -e -o [輸出文件夾的路徑]
比如:
jmeter -n -t test.jmx -l testlogfile -e -o ./output

D:\software\apache-jmeter-3.1\bin>jmeter -n -t test.jmx -l testlogfile -e -o ./output Writing log file to: D:\software\apache-jmeter-3.1\bin\jmeter.log Creating summariser <summary> Error in NonGUIDriver java.lang.IllegalArgumentException: Report generation requ ires csv output format, check 'jmeter.save.saveservice.output_format' property D:\software\apache-jmeter-3.1\bin> 解決方法:修改jmeter.properties文件中的參數值為jmeter.save.saveservice.output_format=csv
實踐總結:
1.錄制后,可能由於誤操作會出現很多多余的請求,必須自己手動刪除。
2.錄制后的請求很亂,不易於理解。可以手動將請求改名,並添加多個事務控制器,將關聯的請求添加到同一個事務控制器中,這樣既有利於區分場景,又便於理解。
3.本次測試中,開發給我的網址是一個IP地址,錄制時總是報如下錯誤:
2018-12-25 17:34:35,901 ERROR o.a.j.p.h.p.Proxy: [51035] Problem with keystore java.io.IOException: >> keytool 錯誤: java.lang.RuntimeException: java.io.IOException: DNSName components must begin with a letter << Command failed, code: 1 'keytool -genkeypair -alias 192.168.11.11 -dname "cn=192.168.11.11, o=JMeter Proxy (TEMPORARY TRUST ONLY)"
-keyalg RSA -keystore proxyserver.jks -storepass {redacted} -keypass {redacted} -validity 7 -ext san=dns:192.168.11.11'
解決方法:在本機上,手動將IP地址映射為域名。比如在C:\Windows\System32\drivers\etc\hosts文件中加入:192.168.11.11 test.com,此時就可以在瀏覽器中輸入test.com來訪問開發所給的網址了,而且還不會報錯。
4.每次開始錄制時,Jmeter彈出輸入KeyStore Password密碼提示,默認密碼是password,輸入后總是報如下錯誤:
2018-12-26 09:04:33,394 ERROR o.a.j.u.SSLManager: Problem loading keystore: Invalid keystore format
java.io.IOException: Invalid keystore format
這個報錯我暫時沒有解決,只知道,重新開始錄制,多試幾次就不報錯了。
5.Jmeter錄制后,每個請求會帶有一些參數,其中很多參數都是取自前一個請求的服務器返回結果,此時你就需要手動將其進行關聯。
6.負載測試時,最好使用命令行運行,小負載測試時,可以使用GUI界面運行,此時一定要把查看結果樹、圖形結果、斷言結果等監聽器全部關掉(只保留一個聚合報告即可,配置將結果輸出到jtl文件中),因為它們真的非常影響性能。
7.當使用外網進行測試時,受網速的影響,白天和夜晚的測試結果差距很大。
8.此次測試我使用Jmeter,同事使用LR,對比發現結果相差很大。查找發現,主要原因時我們倆雖然都是用的一個無線網,但是同事的網沒有限速,網速非常快,而我的網卻限速了,網速很慢。另外,我倆的PC配置也不一樣。后來我們就在同一台機器上運行測試了,發現結果相差不大。
9.可以將登錄場景放在setup線程組(類似LR的init)中,退出場景放在teardown線程組(類似LR的end)中。
附網上相關文章:
Apache JMeter錄制HTTPS的方法及測試中常見問題解決(其中涉及了https工作原理及工作流程)