性能工具之Taurus場景使用(進階篇)

  • 2019 年 12 月 31 日
  • 筆記

前言

在上兩文中介紹了安裝和入門使用,本文我們來看看 Taurus 一些進階的玩法。

性能工具之Taurus入門(安裝篇)

性能工具之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提供了 ConstantThroughputTimerThroughputShapingTimer

而 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