性能工具之Taurus場景使用(進階篇)
- 2019 年 12 月 31 日
- 筆記
前言
在上兩文中介紹了安裝和入門使用,本文我們來看看 Taurus 一些進階的玩法。
複雜場景統一測試
複雜場景的壓力測試,如果有多個同學從事腳本開發,則有時必須使用多個測試腳本文件。這意味着將多個測試腳本需要集成到單個壓力測試中。在 JMeter 中可以通過使用 TestFragments
功能部分解決,但是它需要手動管理主測試模塊才能添加測試片段,將其排列到線程組中,計算壓力場景等。
下面將介紹 Taurus 運行 JMeter 測試,從 YAML 設置和覆蓋 JMeter 測試的某些測試參數,以及使用多個 YAML 文件構建統一的單個測試的各種場景。
多個JMeter JMX測試
這裡我演示三個 JMeter 示例腳本:
- build-ftp-test-plan.jmx
- build-webservice-test-plan
- jmx build-web-test-plan.jmx
運行多個 JMeter JMX 測試就將路徑傳遞到 bzt 命令即可,如下所示:
bzt build-ftp-test-plan.jmx build-webservice-test-plan.jmx build-web-test-plan.jmx
終端中顯示實時測試狀態:

測試後的摘要統計信息:

Taurus 自動獲取 JMeter JMX 腳本並同時執行它們,同時 Taurus 為每個 JMeter 測試腳本生成了一組額外的結果:

文件說明:
- modified_xxxx.jmx:注入了結果編寫器的實際 JMX 文件
- kpi.jtl:主要結果文件(CSV)
- errors.jtl:包含有關錯誤的全面信息(XML)
- jmeter.log:JMeter引擎日誌文件
- 等等
通過 Taurus 執行的每個 JMeter 腳本都有其自己的結果集。這裡結果查看可以使用 MergeResults
插件,該插件可以根據提供的文件的 .jtl 結果繪製區分的圖或合併的圖。
具體參考:https://jmeter-plugins.org/wiki/MergeResults/
效果示圖:

YAML 配置文件
Taurus 還支持從 YAML 文件運行多個現有的 JMeter JMX 測試腳本。
這裡演示 Taurus 使用 2 個 Scenario 同時啟動兩個(或多個)JMeter JMX 測試:
編寫 exist_multiple_jmx_conifg.yml
:
settings: # 環境變量設置 env: BASE_DIR: /home/taurus/taurus_container_scripts # 腳本目錄 artifacts-dir: /home/taurus/taurus_container_artifacts/simple1/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - scenario: simple1 # 場景1名稱 - scenario: simple1 # 場景2名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本1 simple2: script: '${BASE_DIR}/build-ftp-test-plan.jmx' # 腳本2 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
執行命令:
bzt exist_multiple_jmx_conifg.yml
Taurus Console 顯示兩個測試當前正在並行執行:

測試後的摘要統計信息:

覆蓋JMeter測試參數
上面介紹了使用 Taurus 執行現有 JMeter 腳本測試的過程,現在讓我們更深入地了解如何從 YAML 配置文件控制和覆蓋 JMeter 測試參數設置。
單線程組
我們通過修改腳本一次通過一個線程訪問:

現在讓我們通過 YAML 配置文件來運行它:
- 運行現有的 .jmx 腳本
- 設置以下加載方式:
- 並發:10個線程
- 啟動時間:1分鐘
- 持續時間:2分30秒
編寫 cover_exist_jmx_conifg.yml
:
settings: env: BASE_DIR: /home/taurus/taurus_container_scripts # 腳本目錄 artifacts-dir: /home/taurus/taurus_container_artifacts/simple1/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - concurrency: 10 #並發線程數 ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple1 # 場景名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
注意:
- 並發是線程數(並發用戶);它用於10個線程,而不是每秒10個請求;
- 測試持續時間 -是啟動值和持續值的總和,因此10秒後,如果所有10個線程均會啟動,則10個線程將啟動1分鐘(從1個線程開始,每6秒再增加1個)。在正常運行的情況下,測試將繼續進行2分鐘30秒。總測試時間為
1m+2m30s=3分鐘30秒
。
用在 JMeter GUI 中打開生成的 .jmx 文件的 Taurus 命令如下:
bzt cover_exist_jmx_conifg.yml -gui

如上圖所示,修改了 「Number of Threads」, 「Ramp-Up」 和 「Loop Count」 的參數值,根據 YAML 文件設置了測試持續時間,並添加了2個監聽器以存儲測試指標以及有關錯誤的詳細信息。
除了這些基準更改之外,還可以:
- 添加(或覆蓋)任何屬性(包括 JMeter 屬性和系統屬性);
- 添加(或覆蓋)用戶自定義變量;
- 啟用/禁用從線程組開始並以監聽器結束的任何測試元素;
- 修改任何測試元素值;
- 等等
多線程組
我們看到 Taurus 能夠修改基準線程組參數(以及其他測試屬性)。但是,如果我們在 JMeter 測試計劃中有多個線程組怎麼辦?
我們使用上例相同的 YAML 文件,以及幾乎相同的 .jmx 腳本,讓我們添加第二個線程組,複製現有的線程組並將其粘貼到下面:

讓我們再次運行 Taurus,並選擇它顯示生成文件的JMeter gui:
bzt cover_exist_jmx_conifg.yml -gui

如圖所示,第一個線程組的線程數現在減少到 5,這是由於Taurus修改了。Taurus 可以計算並發並將其平均分配到現有的(啟用的)線程組中。第二個線程組也有5個線程數。注意不考慮禁用線程組,而是將其保留在生成的 .jmx 測試腳本中。Taurus不會修改 setUp 和 tearDown 線程組。
多個線程組和不同線程數
Taurus 如何處理多個線程組具有不同線程號的情況。
比如:使用下面 JMeter 測試計劃結構:
- 測試計劃
- 線程組1-5個並發線程數
- 線程組2-10個並發線程數
還有一個Taurus YAML配置文件,其中包含:
- 並發:30
產生的壓力測試配置將如下所示:
- 測試計劃
- 線程組1-10個並發線程數
- 線程組2-20個並發線程數
Taurus 將配置的並發數按比例分配在2個線程組之間,並保持原始場景壓力比例。
多個JMeter JMX測試腳本
可以從 YAML 文件中覆蓋多個 JMeter 測試腳本的執行參數。但是,必須分別為每個 .jmx 文件設置執行參數。先前描述的行為(Taurus 將在 .jmx 文件中的已啟用線程組之間分配已定義的並發數)仍然存在。
相關配置可執行2個並行提供的 JMeter .jmx 腳本,並根據我們配置(10個線程,1分鐘啟動時間,2分半鐘)覆蓋線程數配置,如下所示:
settings: env: BASE_DIR: /home/taurus/taurus_container_scripts # 腳本目錄 artifacts-dir: /home/taurus/taurus_container_artifacts/simple/%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - concurrency: 10 #並發線程數 ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple1 # 場景名稱 - concurrency: 10 #並發線程數 ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple2 # 場景名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本 simple2: script: '${BASE_DIR}/build-ftp-test-plan.jmx' # 腳本 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
讓我們再次運行 Taurus,並選擇它顯示生成文件的JMeter gui:
bzt cover_multiple_threadgroup_exist_jmx_conifg.yml -gui

控制測試中的TPS
長時間來 JMeter 用戶必須不斷嘗試測試,找到確切的線程數和計時器延遲,以產生期望的TPS,並且認為時間可能很耗時並且並不總是準確的而JMeter提供了 ConstantThroughputTimer
和 ThroughputShapingTimer
。


而 Taurus 構建固定 TPS 場景非常簡單,能夠為壓測測試腳本精確設置所需的TPS。
讓我們從一個非常簡單的示例場景開始,一個10用戶壓測,啟動時間為1分鐘,測試持續時間為2分鐘30秒。相關的 Taurus YAML 配置文件為:
cover_exist_jmx_conifg_win.yml
:
settings: env: BASE_DIR: E:Taurus # 腳本目錄 artifacts-dir: E:Taurusartifactssimple1%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - concurrency: 10 #並發線程數 ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple1 # 場景名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
通過 Taurus 運行:

在我們的案例中可以看到,TPS 平均為 10 左右,讓我們通過 Taurus 將其 TPS 限制為5:
編寫 cover_exist_jmx_conifg_limit_tps.yml
:
settings: env: BASE_DIR: E:Taurus # 腳本目錄 artifacts-dir: E:Taurusartifactssimple1%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - concurrency: 10 #並發線程數 throughput: 5 # 限制TPS ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple1 # 場景名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
重新啟動測試後,我們可以看到 TPS 受到限制,並在1分鐘的啟動時間內 TPS 負載逐漸增加到 5。

我們在JMeter GUI中以下方式打開此測試腳本:
bzt cover_exist_jmx_conifg_limit_tps.yml -gui
我們將看到 ThroughputShapingTimer
已添加到測試計劃中,並且其配置與啟動周期和目標 TPS 相匹配。

我們已經注意到 TPS 是通過兩個步驟添加的:
- 在60秒內將負載從1 TPS 增加到 5 TPS(啟動)
- 將負載以5 TPS的速度保持150秒(保持)
我們也可以使用 Taurus 中的 steps 參數來控制所需的步驟數。因此,如果我稍微修改測試並添加 5個步驟,如下所示:
settings: env: BASE_DIR: E:Taurus # 腳本目錄 artifacts-dir: E:Taurusartifactssimple1%Y-%m-%d_%H-%M # path where to save artifacts, default is %Y-%m-%d_%H-%M-%S.%f execution: - concurrency: 10 #並發線程數 throughput: 5 # 限制TPS steps: 5 # 階梯 ramp-up: 1m # 啟動時間 hold-for: 2m30s # 持續時間 scenario: simple1 # 場景名稱 scenarios: simple1: script: '${BASE_DIR}/build-web-test-plan.jmx' # 腳本 modules: jmeter: download-link: 'https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-{version}.zip' # 下載地址 version: 5.2.1 # 版本號 reporting: - module: final-stats # 摘要報告 - module: console # 控制台
然後,將導致以下 ThroughputShapingTimer
配置:

因此,只需要設置步數,Taurus 就會在定義的加速期內自動按比例分配目標TPS。
小結
本文我們介紹了幾種複雜場景的使用方法 ,其中包括:
- 複雜場景統一測試
- 多個JMeter JMX測試;
- YAML 配置文件;
- 覆蓋JMeter測試參數
- 單線程組;
- 多線程組;
- 多個線程組和不同線程數;
- 多個JMeter JMX測試腳本;
- 控制測試中的TPS
總結其核心思想,就是我們可以使用 YAML 來統一描述性能測試,這就是我們想要的 test as code。
示例腳本:
https://github.com/7DGroup/JMeter-examples/tree/master/taurus