多產品軟件供應商經常面臨的問題之一是幾乎每個團隊的工程師(開發人員、測試人員和基礎架構管理員)的能力重複。 這也適用於昂貴的工程師 - 負載測試領域的專家。
工程師通常不得不從頭開始部署測試基礎設施、配置負載工具並將其嵌入,而不是直接履行職責並利用他們獨特的經驗來構建負載測試流程、選擇方法、最佳指標並編寫自動測試他們自己在 CI 系統中,設置監控和發布報告。
您可以找到我們在 Positive Technologies 中使用的測試中一些組織問題的解決方案
概念的本質
負載測試即服務的概念意味著能夠將負載工具 Apache JMeter、Yandex.Tank 和您自己的框架集成到任意持續集成系統中。 該演示將針對 GitLab CI,但所有 CI 系統的原則都是通用的。
負載測試即服務是用於負載測試的集中式服務。 負載測試在專用代理池中運行,結果自動發佈在 GitLab Pages、Influx DB 和 Grafana 或測試報告系統(TestRail、ReportPortal 等)中。 盡可能簡單地實現自動化和縮放——通過在 GitLab CI 項目中添加和參數化常用的 gitlab-ci.yml 模板。
這種方式的好處是整個CI基礎設施、負載代理、負載源的docker鏡像、測試流水線和報告發布都由一個集中的自動化部門(DevOps工程師)維護,負載測試工程師可以集中精力進行測試開發和分析他們的結果,而不處理基礎設施問題。
為了描述簡單,我們假設目標應用程序或被測服務器已經預先部署和配置(可以使用Python、SaltStack、Ansible等中的自動化腳本)。 然後,負載測試即服務的整個概念分為三個階段: 準備、測試、發布報告. 圖表的更多細節(所有圖片均可點擊):
負載測試中的基本概念和定義
在進行負載測試時,我們盡量遵守
負載代理 - 將在其上啟動應用程序的虛擬機 - 加載源(Apache JMeter、Yandex.Tank 或自行編寫的加載模塊)。
測試目標(target) - 安裝在服務器上的服務器或應用程序將受到負載。
測試場景(測試用例) - 一組參數化步驟:用戶操作和對這些操作的預期反應,具有固定的網絡請求和響應,具體取決於指定的參數。
配置文件或加載計劃(配置文件) -在
測試 — 具有一組預定參數的腳本。
測試計劃(test-plan) - 一組測試和負載配置文件。
Testran(測試運行) - 使用完全執行的負載場景和收到的報告運行一項測試的一次迭代。
網絡請求(request) — 從代理髮送到目標的 HTTP 請求。
網絡響應(response) — 從目標發送到代理的 HTTP 響應。
HTTP 響應代碼(HTTP 響應狀態)——來自應用服務器的標準響應代碼。
事務是一個完整的請求-響應循環。 從開始發送請求(request)到接收到響應(response)完成,算一次事務。
交易狀態 - 是否有可能成功完成請求-響應週期。 如果在這個循環中有任何錯誤,那麼整個交易就被認為是不成功的。
響應時間(延遲) - 從發送請求(request)結束到開始接收響應(response)的時間。
負載指標 ——負載測試過程中確定的負載服務和負載代理的特性。
測量負載參數的基本指標
方法論中一些最常用和推薦的
負載代理的指標
在負載下測試的目標系統或應用程序的指標
數 虛擬CPU 和記憶 內存,
圓盤 - 負載代理的“鐵”特性
中央處理器, 內存,磁盤使用 - CPU、內存和磁盤加載的動態
在測試的過程中。 通常以百分比來衡量
最大可用值
網絡吞吐量 (加載代理)- 吞吐量
服務器上的網絡接口,
安裝負載代理的位置。
通常以每秒字節數 (bps) 為單位
網絡吞吐量(on target) - 網絡接口帶寬
在目標服務器上。 通常以每秒字節數 (bps) 為單位
虛擬用戶- 虛擬用戶的數量,
實施負載場景和
模仿真實的用戶操作
虛擬用戶狀態, Passed/Failed/Total — 成功和
虛擬用戶的不成功狀態
對於負載場景,以及它們的總數。
通常預期所有用戶都能夠完成
負載配置文件中指定的所有任務。
任何錯誤都意味著真實用戶將無法
解決您在使用系統時遇到的問題
每秒請求數(分鐘)- 每秒(或分鐘)的網絡請求數。
負載代理的一個重要特性是它可以生成多少請求。
其實這是模擬虛擬用戶訪問應用程序
每秒響應(分鐘)
- 每秒(或分鐘)的網絡響應數。
目標服務的一個重要特徵:多少
生成並發送對查詢的響應
裝載劑
HTTP 響應狀態— 不同響應代碼的數量
從負載代理接收的應用程序服務器。
比如200 OK表示調用成功,
和 404 - 未找到資源
潛伏 (響應時間) - 從結束開始的時間
在開始接收響應(response)之前發送一個請求(request)。
通常以毫秒 (ms) 為單位
交易響應時間— 一次完整交易的時間,
完成請求-響應週期。
這是從發送請求(request)開始的時間
直到完成接收響應(response)。
交易時間可以用秒(或分鐘)來衡量
在幾個方面:考慮最小值,
最大值、平均值,例如第 90 個百分位數。
最小和最大讀數是極端的
系統性能狀態。
第 XNUMX 個百分位數是最常用的,
正如它向大多數用戶展示的那樣,
在系統性能的閾值下舒適地運行
每秒事務數(分鐘) - 完成的數量
每秒事務數(分鐘),
也就是說,應用程序能夠接受多少以及
處理請求並發出響應。
其實這是系統的吞吐量
交易狀態 , 通過/失敗/總 - 數
成功、不成功和交易總數。
對於真實用戶不成功
交易實際上意味著
無法在負載下使用系統
負載測試示意圖
負載測試的概念非常簡單,由三個主要階段組成,我已經提到過: 準備測試報告,即為負載源準備測試目標和設置參數,然後執行負載測試,最後生成並發布測試報告。
原理圖註釋:
- QA.Tester是負載測試專家,
- Target 是您想要了解其在負載下的行為的目標應用程序。
圖中實體、階段和步驟的分類器
階段和步驟
發生了什麼
入口處有什麼
什麼是輸出
Prepare:測試準備階段
加載參數
設置和初始化
用戶
加載參數,
指標的選擇和
測試計劃準備
(負載配置文件)
自定義選項
負載代理初始化
測試計劃
測試目的
VM
雲部署
虛擬機與
要求的特徵
負載代理的 VM 設置
自動化腳本
虛擬機創建
虛擬機配置於
雲
環保
操作系統設置和準備
環境
負載代理工作
環境設置
負載代理
自動化腳本
環境設置
準備好的環境:
操作系統、服務和應用程序,
工作所需
負載代理
負載代理
安裝、配置和參數化
裝載劑。
或者從下載 docker 鏡像
預配置加載源
加載源 docker 鏡像
(YAT、JM或自寫框架)
設置
負載代理
設置並準備就緒
工作負載代理
測試:負載測試的執行階段。 源是部署在 GitLab CI 專用代理池中的負載代理
加載
啟動負載代理
與選定的測試計劃
和加載參數
用戶選項
用於初始化
負載代理
測試計劃
測試目的
執行日誌
負載測試
系統日誌
目標指標和負載代理的變化動態
運行代理
代理執行
大量測試腳本
按照
負載配置文件
加載代理交互
為了測試的目的
測試計劃
測試目的
日誌
收集“原始”日誌
在負載測試期間:
負載代理活動記錄,
測試目標的狀態
和運行代理的虛擬機
執行日誌
負載測試
系統日誌
指標
在測試期間收集“原始”指標
目標指標變化的動態
和負載代理
Report:測試報告準備階段
發電機
處理收集
加載系統和
監控系統“原始”
指標和日誌
報告的形成
人類可讀形式
可能與元素
分析師
執行日誌
負載測試
系統日誌
指標變化的動態
目標和加載代理
處理過的“原始”日誌
以適合的格式
上傳到外部存儲
靜態負載報告,
人類可讀的
發布
報告發表
關於負載
外部測試
服務
處理過的“原始”
以合適的格式記錄
用於卸載到外部
儲存庫
保存在外部
存儲報告
負載,適合
用於人體分析
在 CI 模板中連接加載源
讓我們繼續進行實際操作。 我想展示如何在公司的一些項目上
首先,在我們的 DevOps 工程師的幫助下,我們在 GitLab CI 中創建了一個專用的代理池來運行負載測試。 為了不在模板中將它們與其他的混淆,例如程序集池,我們為這些代理添加了標籤,
如何通過硬件找出所需的功率? 負載代理的特性——足夠數量的 vCPU、RAM 和磁盤——可以根據代理上運行的 Docker、Python(對於 Yandex.Tank)、GitLab CI 代理、Java(對於 Apache JMeter)來計算. 對於 JMeter 下的 Java,還建議使用至少 512 MB 的 RAM,作為上限,
因此,根據我們的經驗,我們建議為負載代理使用至少 4 個 vCPU、4 GB RAM、60 GB SSD。 網卡的吞吐量根據負載配置文件的要求確定。
我們主要使用兩個加載源——Apache JMeter 和 Yandex.Tank docker images。
為了便於在我們公司內部使用,為了測試人員自己更改和添加環境的能力,我們在 GitLab CI 上構建了負載源的 docker 圖像,並發佈到內部
我們為 Yandex.Tank 使用了這個基本的 docker 文件:
Dockerfile
1 | FROM direvius/yandex-tank
2 | ENTRYPOINT [""]
對於 Apache JMeter 這個:
Dockerfile
1 | FROM vmarrazzo/jmeter
2 | ENTRYPOINT [""]
您可以在文章中閱讀我們的持續集成系統的工作原理“
模板和管道
項目中提供了用於進行負載測試的模板示例
該模板非常簡單,演示了上圖中描述的負載測試的三個階段:準備、測試和發布報告。 對此負責
- 階段
Prepare 應該用於預配置測試目標或檢查它們的可用性。 加載源的環境不需要配置,它們被預先構建為docker鏡像並發佈在docker registry中:只需在測試階段指定所需的版本即可。 但是您可以重建它們並製作自己的修改圖像。 - 階段
測試 用於指定加載源、運行測試和存儲測試工件。 您可以選擇任何加載源:Yandex.Tank、Apache JMeter、您自己的或全部。 要禁用不必要的來源,只需註釋掉或刪除作業即可。 負載源的入口點:- Yandex.Tank 的啟動參數在 .
/測試/yandextank.sh , - Apache JMeter 啟動參數在文件中指定
./測試/jmeter.sh .
注意:程序集配置模板用於設置與 CI 系統的交互,並不意味著在其中放置測試邏輯。 對於測試,指定入口點,控制 bash 腳本所在的位置。 運行測試、生成報告和測試腳本本身的方法必須由 QA 工程師實施。 在演示中,對於兩個加載源,Yandex 主頁請求用作最簡單的測試。 腳本和測試參數在目錄中
./測試 . - Yandex.Tank 的啟動參數在 .
- 在舞台上
即時報告 您需要描述如何將在測試階段獲得的測試結果發佈到外部存儲,例如 GitLab Pages 或特殊報告系統。 GitLab Pages 要求 ./public 目錄是非空的,並且在測試完成後至少包含一個 index.html 文件。 您可以閱讀 GitLab Pages 服務的細微差別。鏈接 .如何導出數據的示例:
- 從 JMeter 到
亞搏體育appGitLab頁面 , - 從 Yandex.Tank 到
InfluxDB 和 Grafana .
發佈設置說明:
- HTML 靜態
亞搏體育appGitLab頁面 , - 到 InfluxDB,然後到
格拉法納 .
- 從 JMeter 到
在演示示例中,具有負載測試和兩個負載源(您可以禁用不必要的)的管道如下所示:
Apache JMeter 本身可以生成 HTML 報告,因此使用標準工具將其保存在 GitLab Pages 中更有利可圖。 這是 Apache JMeter 報告的樣子:
在 Yandex.Tank 的演示示例中,您只會看到
總結
在文章中,我談到了“負載測試即服務”(load testing as a service)的概念。 主要思想是使用預先配置的負載代理池、負載源的 docker 圖像、報告系統和基於簡單的 .gitlab-ci.yml 模板(示例
PS 我要非常感謝我的同事 Sergey Kurbanov 和 Nikolai Yusev,感謝他們在我們公司實施負載測試即服務概念方面提供的技術幫助。
作者:
來源: www.habr.com