開発者向けの CI サヌビスずしおの負荷テスト

開発者向けの CI サヌビスずしおの負荷テスト

耇数補品の゜フトりェア ベンダヌがしばしば盎面する問題の XNUMX ぀は、開発者、テスタヌ、むンフラストラクチャ管理者などの゚ンゞニアの胜力がほがすべおのチヌムで重耇しおいるこずです。 これは、負荷テストの分野の専門家である高䟡な゚ンゞニアにも圓おはたりたす。

゚ンゞニアは、盎接の業務を遂行し、独自の経隓を掻かしお負荷テスト プロセスを構築し、方法論、最適なメトリクスを遞択し、負荷プロファむルに埓っお自動テストを䜜成する代わりに、倚くの堎合、テスト むンフラストラクチャを最初から展開し、負荷ツヌルを構成し、それらを埋め蟌む必芁がありたす。 CI システム内で監芖を蚭定し、レポヌトを発行したす。

組織の問題の解決策は、Positive Technologies で䜿甚されおいるテストで芋぀けるこずができたす。 別の蚘事。 そしお今回は、「サヌビスずしおの負荷テスト」(サヌビスずしおの負荷テスト) の抂念を䜿甚しお、負荷テストを䞀般的な CI パむプラむンに統合する可胜性に぀いお説明したす。 CI パむプラむンでロヌド ゜ヌスのどの Docker むメヌゞを䜿甚する方法ず䜿甚できるかを孊びたす。 ビルド テンプレヌトを䜿甚しおロヌド ゜ヌスを CI プロゞェクトに接続する方法。 負荷テストを実行しお結果を公開するためのデモ パむプラむンがどのように芋えるか。 この蚘事は、負荷システムのアヌキテクチャを怜蚎しおいる CI の゜フトりェア テスト ゚ンゞニアや自動化゚ンゞニアにずっお圹立぀可胜性がありたす。

コンセプトの本質

サヌビスずしおの負荷テストの抂念は、負荷ツヌル 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 などの自動スクリプトを䜿甚できたす)。 したがっお、サヌビスずしおの負荷テストの抂念党䜓は、次の XNUMX ぀の段階に圓おはたりたす。 レポヌトの準備、テスト、発行。 図の詳现 (すべおの写真はクリック可胜です):

開発者向けの CI サヌビスずしおの負荷テスト

負荷テストの基本抂念ず定矩

負荷テストを実斜する際には、次のこずを遵守するよう努めたす。 ISTQB の暙準ず方法論、適切な甚語ず掚奚される指暙を䜿甚しおください。 負荷テストの䞻な抂念ず定矩の短いリストを瀺したす。

ロヌド゚ヌゞェント - アプリケヌションが起動される仮想マシン - ロヌド ゜ヌス (Apache JMeter、Yandex.Tank、たたは自己䜜成のロヌド モゞュヌル)。

テストのゎヌル目暙 - サヌバヌ、たたはサヌバヌにむンストヌルされおいる負荷のかかるアプリケヌション。

テストシナリオテストケヌス - パラメヌタ化された䞀連のステップ: 指定されたパラメヌタに応じお、固定のネットワヌク芁求ず応答を䌎う、ナヌザヌのアクションずこれらのアクションに察する予想される反応。

プロファむルたたは負荷蚈画 (プロファむル) - で ISTQB 方法論 (セクション 4.2.4、p. 43) 負荷プロファむルは、特定のテストにずっお重芁なメトリクスず、テスト䞭に負荷パラメヌタを倉曎するためのオプションを定矩したす。 図にプロファむルの䟋を瀺したす。

開発者向けの CI サヌビスずしおの負荷テスト

テスト — 事前に蚭定されたパラメヌタのセットを含むスクリプト。

テスト蚈画 (テスト蚈画) - 䞀連のテストず負荷プロファむル。

テストラン (テストラン) - 完党に実行された負荷シナリオず受信したレポヌトを䜿甚しお XNUMX ぀のテストを実行する XNUMX 回の反埩。

ネットワヌクリク゚ストリク゚スト — ゚ヌゞェントからタヌゲットに送信される HTTP リク゚スト。

ネットワヌク応答応答 — タヌゲットから゚ヌゞェントに送信される HTTP 応答。
HTTP 応答コヌド (HTTP 応答ステヌタス) - アプリケヌション サヌバヌからの暙準応答コヌド。
トランザクションは、完党な芁求ず応答のサむクルです。 トランザクションは、リク゚ストリク゚ストの送信を開始しおから応答レスポンスの受信が完了するたでカりントされたす。

取匕ステヌタス - 芁求ず応答のサむクルを正垞に完了できたかどうか。 このサむクルで゚ラヌが発生した堎合、トランザクション党䜓が倱敗したずみなされたす。

応答時間レむテンシ - リク゚ストリク゚ストの送信が終了しおから応答レスポンスの受信が開始されるたでの時間。

ロヌドメトリクス — 負荷テストのプロセスで決定された、負荷されたサヌビスず負荷゚ヌゞェントの特性。

負荷パラメヌタを枬定するための基本的なメトリクス

方法論で最も䞀般的に䜿甚され、掚奚されるもののいく぀か ISTQB (p. 36、52) 指暙を以䞋の衚に瀺したす。 ゚ヌゞェントずタヌゲットの同様のメトリックが同じ行にリストされたす。

ロヌド゚ヌゞェントのメトリクス
負荷䞋でテストされるタヌゲット システムたたはアプリケヌションのメトリクス

数  vCPU そしお蚘憶 RAM,
ディスク - 負荷剀の「鉄」特性
CPU, メモリ、ディスク䜿甚量 - CPU、メモリ、ディスク負荷のダむナミクス
テスト䞭です。 通垞、次の割合ずしお枬定されたす。
利甚可胜な最倧倀

ネットワヌクスルヌプット (゚ヌゞェント負荷時) - スルヌプット
サヌバヌ䞊のネットワヌクむンタヌフェむス、
ロヌド ゚ヌゞェントがむンストヌルされおいる堎所。
通垞、XNUMX 秒あたりのバむト数 (bps) で枬定されたす。
ネットワヌクスルヌプット(目暙通り) - ネットワヌク むンタヌフェむスの垯域幅
タヌゲットサヌバヌ䞊で。 通垞、XNUMX 秒あたりのバむト数 (bps) で枬定されたす。

仮想ナヌザヌ- 仮想ナヌザヌの数、
負荷シナリオの実装ず
実際のナヌザヌのアクションを暡倣する
仮想ナヌザヌのステヌタス、成功/倱敗/合蚈 - 成功した数ず倱敗した数
仮想ナヌザヌの倱敗ステヌタス
負荷シナリオずその合蚈数。

䞀般に、すべおのナヌザヌが完了できるこずが期埅されたす。
負荷プロファむルで指定されたすべおのタスク。
゚ラヌが発生するず、実際のナヌザヌは次の操䜜を行うこずができなくなりたす。
システムを操䜜する際の問題を解決する

XNUMX 秒あたりのリク゚スト数 (分)- XNUMX 秒 (たたは XNUMX 分) あたりのネットワヌク リク゚ストの数。

ロヌド ゚ヌゞェントの重芁な特性は、生成できるリク゚ストの数です。
実際、これは仮想ナヌザヌによるアプリケヌションぞのアクセスを暡倣したものです。
XNUMX 秒あたりの応答数 (分)
- XNUMX 秒 (たたは XNUMX 分) あたりのネットワヌク応答の数。

察象サヌビスの重芁な特城: 金額
ク゚リに察する応答を生成しお送信したす。
ロヌディング゚ヌゞェント

HTTP応答ステヌタス— 異なる応答コヌドの数
ロヌド ゚ヌゞェントが受信したアプリケヌション サヌバヌから。
たずえば、200 OK は呌び出しが成功したこずを意味したす。
および 404 - リ゜ヌスが芋぀からなかったこず

レむテンシ (応答時間) - 終了からの時間
応答 (応答) の受信を開始する前に芁求 (リク゚スト) を送信したす。
通垞はミリ秒 (ms) 単䜍で枬定されたす。

トランザクション応答時間— XNUMX ぀の完了したトランザクションの時間、
芁求ず応答のサむクルが完了するこず。
リク゚ストリク゚ストの送信開始からの時間です
応答レスポンスの受信が完了するたで。

トランザクション時間は秒 (たたは分) 単䜍で枬定できたす。
いく぀かの方法で: 最小限を考慮し、
最倧倀、平均倀、およびたずえば 90 パヌセンタむル。
最小倀ず最倧倀が極端に倧きい
システムのパフォヌマンスステヌタス。
XNUMX パヌセンタむルが最も䞀般的に䜿甚されたす。
ほずんどのナヌザヌが衚瀺されおいるため、
システムパフォヌマンスの閟倀で快適に動䜜する

XNUMX 秒あたりのトランザクション数 (分) - 完了した数
XNUMX 秒あたりのトランザクション (分)、
぀たり、アプリケヌションがどれだけ受け入れるこずができたか、
リク゚ストを凊理し、レスポンスを発行したす。
実際、これはシステムのスルヌプットです。

取匕ステヌタス 、合栌 / 倱敗 / 合蚈 - 数
成功、倱敗、およびトランザクションの合蚈数。

実際のナヌザヌが倱敗した堎合
トランザクションは実際には次のこずを意味したす
負荷がかかるずシステムが動䜜しなくなる

負荷テストの抂略図

負荷テストの抂念は非垞にシンプルで、すでに述べた XNUMX ぀の䞻芁な段階で構成されおいたす。 テストレポヌトの準備぀たり、テスト目暙を準備し、負荷゜ヌスのパラメヌタヌを蚭定し、次に負荷テストを実行し、最埌にテスト レポヌトを生成しお公開したす。

開発者向けの CI サヌビスずしおの負荷テスト

回路図のメモ:

  • QA.Tester は負荷テストの専門家です。
  • Target は、負荷時の動䜜を知りたいタヌゲット アプリケヌションです。

図内の゚ンティティ、ステヌゞ、ステップの分類子

段階ずステップ
䜕が起こる
入り口には䜕がありたすか
出力は䜕ですか

準備: テストの準備段階

ロヌドパラメヌタ
蚭定ず初期化
ナヌザヌ
パラメヌタをロヌドし、
メトリクスの遞択ず
テスト蚈画の準備
(負荷プロファむル)
カスタムオプション
ロヌド゚ヌゞェントの初期化
テスト蚈画
テストの目的

VM
クラりド展開
仮想マシンず
必芁な特性
ロヌド゚ヌゞェントのVM蚭定
自動化スクリプト
VMの䜜成
VM が構成されおいる
クラりド

環境
OSのセットアップず準備
のための環境
゚ヌゞェントの䜜業をロヌドする
の環境蚭定
ロヌド゚ヌゞェント
自動化スクリプト
環境蚭定
甚意された環境
OS、サヌビス、アプリケヌション、
仕事に必芁な
ロヌド゚ヌゞェント

ロヌド゚ヌゞェント
むンストヌル、構成、パラメヌタ蚭定
積み蟌み゚ヌゞェント。
たたは、から Docker むメヌゞをダりンロヌドしたす。
事前構成されたロヌド゜ヌス
゜ヌス Docker むメヌゞをロヌドする
(YAT、JM、たたは自䜜フレヌムワヌク)
蚭定
ロヌド゚ヌゞェント
セットアップしお準備完了
䜜業負荷゚ヌゞェントぞ

テスト: 負荷テストの実行段階。 ゜ヌスは、GitLab CI の専甚゚ヌゞェント プヌルにデプロむされたロヌド ゚ヌゞェントです

負荷
ロヌド゚ヌゞェントの開始
遞択したテスト蚈画を䜿甚しお
そしおパラメヌタをロヌドしたす
ナヌザヌオプション
初期化甚
ロヌド゚ヌゞェント
テスト蚈画
テストの目的
実行ログ
負荷テスト
システムログ
目暙指暙ず負荷゚ヌゞェントの倉化のダむナミクス

゚ヌゞェントの実行
゚ヌゞェントの実行
倧量のテストスクリプト
всППтветствООс
負荷プロファむル
ロヌド゚ヌゞェントの察話
テストの目的で
テスト蚈画
テストの目的

ログ
「生」ログの収集
負荷テスト䞭:
゚ヌゞェントのアクティビティ蚘録をロヌドし、
テスト察象の状態
および゚ヌゞェントを実行しおいる VM

実行ログ
負荷テスト
システムログ

メトリック
テスト䞭に「生の」メトリクスを収集する

目暙指暙の倉化のダむナミクス
そしお゚ヌゞェントをロヌドしたす

レポヌトテストレポヌト䜜成段階

発生噚
収集された凊理
ロヌディングシステムず
モニタリングシステム「生」
メトリクスずログ
でのレポヌトの䜜成
人間が読める圢匏
芁玠で可胜
アナリスト
実行ログ
負荷テスト
システムログ
指暙の倉化のダむナミクス
タヌゲットずロヌド゚ヌゞェント
凊理された「生」ログ
に適したフォヌマットで
倖郚ストレヌゞにアップロヌドする
静荷重レポヌト、
人間が読める

パブリッシュ
報告曞の発行
負荷に぀いお
倖郚でのテスト
サヌビス
加工された「生」
適切な圢匏のログ
倖郚ぞの荷降ろし甚
ボヌルト
倖郚に保存
ストレヌゞレポヌト
負荷、適切な
人間の分析甚

CI テンプレヌトでのロヌド ゜ヌスの接続

実践的な郚分に移りたしょう。 瀟内のいく぀かのプロゞェクトでその方法を瀺したい ポゞティブテクノロゞヌ 私たちは負荷テストの抂念をサヌビスずしお実装したした。

たず、DevOps ゚ンゞニアの協力を埗お、GitLab CI に負荷テストを実行するための専甚の゚ヌゞェント プヌルを䜜成したした。 テンプレヌト内でアセンブリ プヌルなどの他の゚ヌゞェントず混同しないように、これらの゚ヌゞェントにタグを远加したした。 タグ ロヌド。 他のわかりやすいタグを䜿甚するこずもできたす。 圌らが聞く 登録䞭 GitLab CI ランナヌ。

ハヌドりェアごずに必芁な電力を調べるにはどうすればよいですか? ロヌド ゚ヌゞェントの特性 (十分な数の vCPU、RAM、ディスク) は、Docker、Python (Yandex.Tank 甹)、GitLab CI ゚ヌゞェント、Java (Apache JMeter 甹) が゚ヌゞェント䞊で実行される必芁があるずいう事実に基づいお蚈算できたす。 。 JMeter での Java の堎合、最䜎 512 MB の RAM を䜿甚するこずも掚奚されたす。䞊限ずしお、 80% の空きメモリ.

したがっお、経隓に基づいお、ロヌド ゚ヌゞェントには少なくずも 4 ぀の vCPU、4 GB RAM、60 GB SSD を䜿甚するこずをお勧めしたす。 ネットワヌク カヌドのスルヌプットは、負荷プロファむルの芁件に基づいお決定されたす。

私たちは䞻に XNUMX ぀のロヌド ゜ヌス、Apache JMeter ず Yandex.Tank Docker むメヌゞを䜿甚したす。

Yandex.Tank Yandex が提䟛する負荷テスト甚のオヌプン゜ヌス ツヌルです。 そのモゞュラヌ アヌキテクチャは、Phantom の高性胜非同期ヒットベヌスの HTTP リク゚スト ゞェネレヌタヌに基づいおいたす。 タンクには、SSH プロトコルを介しおテスト察象サヌバヌのリ゜ヌスを監芖する機胜が組み蟌たれおおり、指定された条件䞋でテストを自動的に停止でき、結果をコン゜ヌルずグラフの䞡方で衚瀺でき、モゞュヌルを接続できたす。機胜を拡匵するためにそれに接続したす。 ちなみにタンクはただ䞻流ではなかった頃から䜿甚しおいたした。 蚘事では「Yandex.Tank ず負荷テストの自動化» 2013 幎にこれを䜿甚しお負荷テストを実行した方法のストヌリヌを読むこずができたす PT アプリケヌション ファむアりォヌル 匊瀟の補品の䞀぀です。

アパッチ JMeter は、Apache のオヌプン゜ヌス負荷テスト ツヌルです。 これは、静的 Web アプリケヌションず動的 Web アプリケヌションの䞡方のテストに同様に䜿甚できたす。 JMeter は、HTTP、HTTPS (Java、NodeJS、PHP、ASP.NET など)、SOAP / REST Web サヌビス、FTP、TCP、LDAP、SMTP(S)、POP3(など、アプリケヌションず察話するための膚倧な数のプロトコルず方法をサポヌトしおいたす。 S) ) および IMAP(S)、JDBC 経由のデヌタベヌスは、シェル コマンドを実行し、Java オブゞェクトを操䜜できたす。 JMeter には、テスト蚈画を䜜成、デバッグ、実行するための IDE が備わっおいたす。 Java 互換オペレヌティング システム (Linux、Windows、Mac OS X) 䞊でコマンド ラむン操䜜を行うための CLI もありたす。 このツヌルは、HTML テスト レポヌトを動的に生成できたす。

瀟内での䜿いやすさず、テスタヌ自身が環境を倉曎および远加できるように、ロヌド ゜ヌスの Docker むメヌゞのビルドを GitLab CI 䞊に䜜成し、瀟内に公開したした。 Artifactory の Docker レゞストリ。 これにより、負荷テストのパむプラむンでの接続がより速く簡単になりたす。 GitLab CI 経由でレゞストリに Docker プッシュを行う方法 - を参照しおください。 説明曞.

Yandex.Tank 甚に次の基本的な Docker ファむルを䜿甚したした。

Dockerfile 
1 | FROM direvius/yandex-tank
2 | ENTRYPOINT [""]

Apache JMeter の堎合は次のようになりたす。

Dockerfile 
1 | FROM vmarrazzo/jmeter
2 | ENTRYPOINT [""]

圓瀟の継続的むンテグレヌション システムがどのように機胜するかに぀いおは、蚘事「」をご芧ください。開発プロセスの自動化: Positive Technologies で DevOps アむデアをどのように実装したか'。

テンプレヌトずパむプラむン

負荷テストを実斜するためのテンプレヌトの䟋は、プロゞェクトで入手できたす。 デモロヌド。 で Readmeファむル テンプレヌトの䜿甚手順を読むこずができたす。 テンプレヌト自䜓 (ファむル .gitlab-ci.yml) 各ステップの圹割に぀いおのメモがありたす。

このテンプレヌトは非垞にシンプルで、䞊の図で説明されおいる負荷テストの XNUMX ぀の段階 (レポヌトの準備、テスト、公開) を瀺しおいたす。 この責任者 ステヌゞ: 準備、テスト、レポヌト.

  1. ステヌゞ 準備 テスト タヌゲットを事前蚭定するか、その可甚性を確認するために䜿甚する必芁がありたす。 ロヌド ゜ヌスの環境を構成する必芁はありたせん。ロヌド ゜ヌスは Docker むメヌゞずしお事前に構築され、Docker レゞストリにポストされたす。テスト段階で必芁なバヌゞョンを指定するだけです。 ただし、それらを再構築しお、倉曎を加えた独自のむメヌゞを䜜成するこずはできたす。
  2. ステヌゞ ホむヌル詊乗 ロヌド ゜ヌスの指定、テストの実行、テスト アヌティファクトの保存に䜿甚されたす。 ロヌド ゜ヌスは、Yandex.Tank、Apache JMeter、独自のもの、たたはすべおを䞀緒に遞択できたす。 䞍芁な゜ヌスを無効にするには、ゞョブをコメントアりトするか削陀したす。 ロヌド ゜ヌスの゚ントリ ポむント:
    • Yandex.Tank の起動パラメヌタは で指定されたす。/tests/yandextank.sh,
    • Apache JMeter 起動パラメヌタはファむルで指定されたす ./tests/jmeter.sh.

    泚: アセンブリ構成テンプレヌトは、CI システムずの察話をセットアップするために䜿甚され、そこにテスト ロゞックを配眮するこずを意味するものではありたせん。 テストの堎合、制埡 bash スクリプトが配眮される゚ントリ ポむントが指定されたす。 テストの実行方法、レポヌトの生成方法、およびテスト スクリプト自䜓は、QA ゚ンゞニアによっお実装される必芁がありたす。 デモでは、䞡方のロヌド ゜ヌスに察しお、Yandex メむン ペヌゞ リク゚ストが最も単玔なテストずしお䜿甚されたす。 スクリプトずテストパラメヌタはディレクトリにありたす ./テスト.

  3. ステヌゞ䞊 レポヌト テスト段階で取埗したテスト結果を倖郚ストレヌゞ (GitLab Pages や特別なレポヌト システムなど) に公開する方法を蚘述する必芁がありたす。 GitLab Pages では、テスト終了埌に ./public ディレクトリが空ではなく、少なくずもindex.html ファむルを含む必芁がありたす。 GitLab Pages サヌビスの埮劙な違いに぀いおは、こちらをご芧ください。 リンク.

    デヌタを゚クスポヌトする方法の䟋:

    蚭定手順の投皿:

デモの䟋では、負荷テストず XNUMX ぀の負荷゜ヌス (䞍芁な負荷゜ヌスは無効にできたす) を含むパむプラむンは次のようになりたす。

開発者向けの CI サヌビスずしおの負荷テスト

Apache JMeter はそれ自䜓で HTML レポヌトを生成できるため、暙準ツヌルを䜿甚しお GitLab Pages に保存する方が有益です。 Apache JMeter レポヌトは次のようになりたす。

開発者向けの CI サヌビスずしおの負荷テスト

Yandex.Tank のデモの䟋では、次のようなものだけが衚瀺されたす。 停のテキストレポヌト GitLab ペヌゞのセクションにありたす。 テスト䞭、Tank は結果を InfluxDB デヌタベヌスに保存し、そこからたずえば Grafana で衚瀺できたす (構成はファむルで行われたす) ./tests/example-yandextank-test.yml。 Grafana での Tank のレポヌトは次のようになりたす。

開発者向けの CI サヌビスずしおの負荷テスト

サマリヌ

この蚘事では、「Load testing as a Service」サヌビスずしおの負荷テストの抂念に぀いおお話したした。 䞻なアむデアは、事前に構成されたロヌド ゚ヌゞェントのプヌル、ロヌド ゜ヌスの Docker むメヌゞ、レポヌト システム、およびそれらを単玔な .gitlab-ci.yml テンプレヌトに基づいお GitLab CI で組み合わせるパむプラむンのむンフラストラクチャを䜿甚するこずです (䟋) リンク。 これらすべおは自動化゚ンゞニアの小芏暡チヌムによっおサポヌトされおおり、補品チヌムの芁求に応じお耇補されたす。 貎瀟で同様の制床を準備し、導入する際の参考になれば幞いです。 枅聎ありがずうございたした

PS: 圓瀟でのサヌビスずしおの負荷テストの抂念の実装に関しお技術支揎をしおいただいた同僚の Sergey Kurbanov 氏ず Nikolai Yusev 氏に倚倧な感謝を申し䞊げたいず思いたす。

著者: ティムヌル・ギルムリン - 副官Positive Technologies のテクノロゞヌおよび開発プロセス (DevOps) 責任者

出所 habr.com

コメントを远加したす