jmeter錄制https請求


工具: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-->點擊Validate-->查看View Results Tree是否運行正常),保存測試計划(千萬千萬別忘記保存測試計划喲)。

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)中。

 

附網上相關文章:

官網1簡單步驟

官網2補充說明

官網內容翻譯

Apache JMeter錄制HTTPS的方法及測試中常見問題解決(其中涉及了https工作原理及工作流程) 

也許,這樣理解HTTPS更容易

 


免責聲明!

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



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