編寫 bzt 指令碼的正確姿勢
這是今年1月24日的舊文,發現沒在這裡發過,就搬運過來了。
宣告
- 本文討論的使用場景主要為 使用已有的 jmx 指令碼,並配合 json 對 jmx 指令碼進行部分引數的動態修改 。
- 只補充一些官方文件上沒有提到的使用注意事項,所以官網上闡述得比較清楚的點,文章裡就不再贅述。
什麼是 bzt?
bzt,全名是 Blazemeter taurus
,是Blazemeter旗下的一款開源元件,官方宣稱此元件的底層依賴於 JMeter
、 Gatling
、 Locust.io
和 Selenium WebDriver
,並且經過了自動化程度高、可操作性好的封裝,使得效能測試與功能測試的過程變得更加簡單。
使用 bzt 壓測的基本流程
使用 bzt 中的 jmeter
引擎壓測,有兩種方式:
-
直接執行已有的 jmx 檔案
bzt example.jmx
-
利用
yaml
或者json
生成一個 jmx 指令碼並執行bzt example.yaml / bzt example.json
可以發現,其實 jmeter
裡執行的始終是 jmx 檔案,只不過 bzt 對 jmx 檔案做了一層包裝,使得沒有接觸過 jmeter 的使用者也可以根據官方文件的指引用 yaml/json
生成較為簡單的 jmx 指令碼。
編寫指令碼的注意事項
本文主要討論的使用場景來源於我們所開發的 TCPS 平臺——使用者上傳自己的 jmx 指令碼,而使用者每次執行指令碼時都可能會修改這幾個值:①需要壓測的執行緒、②併發數和③壓測時長;另外在執行指令碼前,使用者還需要除錯指令碼,並得到請求的 response 資料。
1. 如何修改已有指令碼的某項引數值
通過 bzt 所提供的 set-prop
引數,可以動態修改已有指令碼的某些引數值,如圖:
但是官方文件中沒有提到的事情有:
- 只能通過節點的 testname 識別到該節點。
- 當有多個節點的 testname 相同時,會修改所有擁有相同 testname 的節點的值
- 沒有辦法識別 jmx 的層級,如果需要區分兩個不同層級的節點,建議修改 testname
2. 如何選擇性地執行已有指令碼的執行緒組?
圖中的紅框部分就是啟用部分執行緒組,禁用另一部分執行緒組,以達到動態選擇執行緒組去執行的目的。
語法格式很好明白,但是有那麼幾點注意事項:
-
通過 ThreadGroup 的 testname 去識別執行緒組,並且把該 ThreadGroup 節點的
enable
值設定為true
或者false
,如圖: -
在設定
enable
的執行緒組陣列時,如果腳本里有多個 testname 相同的執行緒組,有以下幾種情況:(1)這幾個執行緒組節點的 enable 值都為
false
;bzt 不會執行任何一個執行緒組(2)這幾個執行緒組節點的 enable 值有些為
false
,有些為true
;bzt 只會執行enable
值為true
的執行緒組(3)這幾個執行緒組節點的 enable 值都為
true
;bzt 會執行全部執行緒組 -
在設定
disable
的執行緒組陣列時,不管執行緒組原本的enable
值為true
或者false
,都會被設定為false
3. 如何檢視具體的測試結果?
bzt 提供兩種檢視結果的方式,分別是 xml
格式和 csv
格式。
檢視 xml
結果
如果想得到 xml
格式的結果,具體的指令碼設定如下:
{ "execution": [ { "write-xml-jtl": "error", "scenario": "example" } ], "scenarios": { "example": { "script": "example.jmx" } }, "modules": { "jmeter": { "xml-jtl-flags": { "xml":`true`, "fieldNames":`true`, "time":`true`, "timestamp":`true`, "latency":`true`, "connectTime":`true`, "success":`true`, "label":`true`, "code":`true`, "message":`true`, "threadName":`true`, "dataType":`true`, "encoding":`true`, "assertions":`true`, "subresults":`true`, "responseData":`false`, "samplerData":`false`, "responseHeaders":`true`, "requestHeaders":`true`, "responseDataOnError":`true`, "saveAssertionResultsFailureMessage":`true`, "bytes":`true`, "threadCounts":`true`, "url":`true` } } } }
其中 write-xml-jtl
的值有 error
(預設值) 、 full
、 none
三種,以下依次介紹三種情況。
-
當
write-xml-jtl
的值為error
時設定完成並執行後,會從專案資料夾裡得到
檢視這兩個檔案,裡面的內容分別是error.jtl
和kpi.jtl
兩個結果檔案,如圖這是因為我測試的兩個介面都返回了404,而
write-xml-jtl
的值為error
則表示把錯誤日誌以xml
格式輸出。 -
當
write-xml-jtl
的值為full
時執行後,會從專案資料夾裡得到
trace.jtl
和kpi.jtl
兩個結果檔案,如圖檢視這兩個檔案的內容,會得到
因為我們把
write-xml-jtl
的值設定為full
,那麼 bzt 就把所有的日誌都以xml
格式列印在了trace.jtl
這個檔案裡了。 -
當
write-xml-jtl
的值為none
時執行後,專案資料夾裡只有
kpi.jtl
這個結果檔案,如圖檢視這個檔案的內容,如圖
這意味著如果我們把
write-xml-jtl
的值設定為none
,它不會列印任何值,專案裡只有預設生成的結果檔案。
檢視 csv
結果
如果想得到 csv
格式的結果,指令碼設定如下:
{ "modules": { "jmeter": { "csv-jtl-flags": { "xml": false, "fieldNames": true, "time": true, "timestamp": true, "latency": true, "connectTime": true, "success": true, "label": true, "code": true, "message": true, "threadName": true, "dataType": false, "encoding": false, "assertions": false, "subresults": false, "responseData": false, "samplerData": false, "responseHeaders": false, "requestHeaders": false, "responseDataOnError": false, "saveAssertionResultsFailureMessage": false, "bytes": true, "hostname": true, "threadCounts": true, "url": false } } } }
用同樣的介面測試後,會得到一個 kpi.jtl
檔案,如圖
檢視檔案,可以看到剛才設定的值都被打印出來了,如圖
如果把所有的屬性值都設定成 true
,那麼會得到下面這個檔案
注意事項
無論是使用 xml
還是 csv
,有兩點需要注意
-
當使用
csv-jtl-flags
的時候,xml
屬性必須為false
,不然會得到Error: Could not determine delimiter
報錯,如圖 -
當使用
xml-jtl-flags
的時候,如果xml
屬性為false
,bzt 不會報錯,但是生成的所有結果檔案都會是csv
格式,如圖(1)只打印錯誤資訊
(2)列印所有資訊
- 執行緒池底層原理詳解與原始碼分析
- 30分鐘掌握 Webpack
- 線性迴歸大結局(嶺(Ridge)、 Lasso迴歸原理、公式推導),你想要的這裡都有
- 【前端必會】webpack loader 到底是什麼
- 中心化決議管理——雲端分析
- HashMap底層原理及jdk1.8原始碼解讀
- 詳解JS中 call 方法的實現
- 列印 Logger 日誌時,需不需要再封裝一下工具類?
- 初識設計模式 - 代理模式
- 密碼學奇妙之旅、01 CFB密文反饋模式、AES標準、Golang程式碼
- Springboot之 Mybatis 多資料來源實現
- CAS核心思想、底層實現
- 面試突擊86:SpringBoot 事務不回滾?怎麼解決?
- 基於electron vue element構建專案模板之【打包篇】
- MiniWord .NET Word模板引擎,藉由Word模板和資料簡單、快速生成檔案。
- 認識執行緒,初始併發
- 1-VSCode搭建GD32開發環境
- 初識設計模式 - 原型模式
- 執行緒安全問題的產生條件、解決方式
- 2>&1到底是什麼意思?