利用Python Locust庫基於Robot Framework實現接口性能測試(一)

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

考慮到文章篇幅過長,計劃分兩部分寫完《利用Python Locust庫基於Robot Framework實現接口性能測試》,包含設計策略、框架設計、核心源碼的分享,本篇主要分享設計策略、框架設計及實際應用效果。核心源碼部分將在第二部分中進行分享,文章鏈接如下:

由於公司內測試環境(Linux虛擬機)系統資源性能指標無法保證,使得業務性能受到影響,進而導致性能測試結果的可靠性較低,因此性能測試大多在實際生產環境上進行。

因此萌生一個想法——如何提高測試環境性能測試結果的可靠性並實現持續構建性能測試?

性能瓶頸的影響因素

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

性能瓶頸定位從維度上劃分,性能指標主要分為兩大類,分別是業務性能指標系統資源性能指標。

業務性能指標可以直觀地反映被測系統的實際性能狀況,常用的指標項有:

  • 併發用戶數
  • 事務吞吐率(TPS/RPS)
  • 事務平均響應時間
  • 事務成功率

系統資源性能指標,主要是反映整個系統環境的硬件資源使用情況,常用的指標包括:

  • 服務器:CPU利用率、處理器隊列長度、內存利用率、磁盤IO狀態、網卡帶寬使用情況等。
  • 數據庫:數據庫連接數、數據庫讀寫響應時長、數據庫讀寫吞吐量等。
  • 網絡:網絡吞吐量、網絡帶寬、網絡緩衝池大小。
  • 緩存(Redis):靜態資源緩存命中率、動態數據緩存命中率、緩存吞吐量等。
  • 測試設備(壓力發生器):CPU利用率、處理器隊列長度、內存利用率、內存交換頁面數、磁盤IO狀態、網卡帶寬使用情況等。

測試環境下測試結果可靠性的探討

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

在測試環境系統資源性能指標不滿足性能測試條件時,性能的測試結果是難以被認可的。這也是我們在測試環境(linux虛擬機)下,不做性能測試的原因,只有在生產環境進行實測時,會開展性能測試。

矛盾雙方是可以互相轉換的,假如測試環境的測試結果不是進行性能評估的,而是用來比對的呢?——與上一次該接口在該測試環境下的性能測試結果比較。實現接口的不同版本的橫向比較。理論上,不同版本非重大改動的情況下的接口性能指標是相對穩定的(測試環境數據量等因素已考慮),因此我們利用這一點,進行同一接口在相同測試環境下的不同版本的性能指標比較結果是相對可靠的。

持續性的性能測試探討

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

隨著版本的迭代,每次迭代是否需要進行接口的性能測試,個人認為是需要的。但由於實際的測試環境、人力投入、測試周期等因素,難以做到持續性的性能測試,大多數在某一個版本或交付版本進行性能測試,再進一步就是線上生產環境的性能監控。

那麼是否有必要構建持續性的性能測試呢,如何構建?是否可以像構建自動化用例那樣,快速的構建接口的性能測試用例呢?使性能測試常態化,抱著這種期望,在前段時間,我使用Python的Locust庫基於Robot Framework做了一次嘗試,實踐效果不錯,隨後也應用到了實際項目當中。

持續性的性能測試設計策略

核心理念

圍繞產品進行持續性的業務性能指標比對,實現性能測試的常態化。

框架定位

該框架適應於對接口進行持續性的性能

比對,如比對新舊版本接口的性能指標差異是否保持在合理的範圍內,以便對新舊版本性能差異較大的接口進行更深層的性能測試。

框架構建

技術棧:Python、 Locust、Robot Framework、SqLite

如下圖所示,整體架構目前分為壓力生成關鍵字、負載控制(包含結果採集)關鍵字、結果分析器關鍵字、文件清除關鍵字四部分。

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

性能測試整體設計

壓力生成關鍵字

根據性能測試用例模版與接口請求類型、檢查點、請求體等內容構建Locustfile文件(接口性能測試用例),當前只支持單接口的性能測試:

請求參數說明

  • host:host地址
  • url:請求url
  • method:請求方式
  • web_reg_find:檢查點
  • parameterization:參數,填寫文本地址默認進行參數化處理。
  • parameter_allocation_update: 參數分配和更新方式
  • min_wait:最小等待時間,默認10ms
  • max_wait:最大等待時間,默認20ms

響應返回說明

  • filename :初始化性能測試腳本路徑

負載控制(包含結果採集)關鍵字

運行接口性能測試用例,獲取性能測試結果,並實現結果入DB數據庫:

請求參數說明

  • locustfile:locustfile腳本路徑
  • locust_command:locust命令

響應返回說明

  • result:接口測試結果

結果分析關鍵字

獲取性能測試結果根據閾值校驗項,檢測各項結果是否超過歷史平均結果的閾值設定,如果異常則斷言失敗。

請求參數說明

  • result:接口測試結果
  • threshold_value:比對閾值,默認超過歷史測試結果平均數的20%,則視為異常。
  • search:閾值校驗項,默認關注平均、最大、最小、中位響應時間、rps
  • result:接口測試結果
  • threshold_value:比對閥值,默認超過歷史測試結果平均數的20%,則視為異常。
  • search:關注點,默認關注平均、最大、最小、中位響應時間、rps

文件清除關鍵字

刪除臨時文件,包含Locustfile文件、執行結果文件:

請求參數說明

  • filename:Locustfile路徑

考慮到文章篇幅過長可能影響閱讀體驗,關於每個關鍵字的設計及核心源碼分享我們將在後續文章中分享。

應用效果

場景一 單接口性能測試,無參數化。

我們可以看到通過幾行簡單的配置,就可完成接口的性能測試用例開發。

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

場景二 單接口性能測試,參數化。

參數化數據存放在parameterfile.txt中。

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

參數化文件 parameterfile.txt

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

測試結果

一般情況,此次測試結果不超過歷史均值的設定閥值,則視為通過,否則異常。

利用Python Locust庫基於Robot Framework實現接口性能測試(一)

運行結果

若對你有所幫助,歡迎大家評論、留言。

相關閱讀


分享到:


相關文章: