ソフトウェアテストにおけるストレステストとは何ですか?

⚡ スマートサマリー

ストレステストは、アプリケーションを通常の動作限界を超えて負荷をかけ、限界点を見つけ出し、障害が適切に処理されることを確認し、極端な負荷が取り除かれた後にシステムが正常に復旧することを証明します。

  • 🔘 定義: ストレステストは、実際の運用環境で発生するトラフィックよりもはるかに大きな負荷がかかった状態での堅牢性とエラー処理能力を測定します。
  • ☑️ 目的: このテストでは、故障箇所を正確に特定し、負荷が正常値に戻った後の復旧可能性を検証します。
  • 範囲: 分散型、アプリケーション型、トランザクション型、システム型、探索型といった各バリアントは、それぞれシステムの異なる層に負荷をかける。
  • 🧪 プロセス: 計画、スクリプト作成、実行、分析、そして調整――通常、目標達成までに3~4回のサイクルを経る。
  • 🛠️ ツーリング: LoadRunner、 Apache JMeterStressTester、および Neo同時仮想ユーザーを生成し、応答データを取得する。
  • 📊 指標: スループット、1秒あたりのページ数、ヒット時間、最初のバイトまでの時間、および接続失敗数は、結果を定量化する指標となる。

ソフトウェアテストにおけるストレステスト

ストレステストとは何ですか?

ストレステスト ストレステストは、ソフトウェアアプリケーションの安定性と信頼性を検証するソフトウェアテストの一種です。ストレステストの目的は、極めて高い負荷条件下でのソフトウェアの堅牢性とエラー処理能力を測定し、緊急時にソフトウェアがクラッシュしないことを確認することです。意図的に通常の動作範囲を超えたテストを行い、極限状態におけるソフトウェアの動作を評価します。

ストレステストでは、テスト対象アプリケーション(AUT)に短時間負荷をかけ、その耐性を調べます。ストレステストの最も重要な用途は、システム、ソフトウェア、またはハードウェアが破損する限界値を特定することです。また、その限界値を超えた場合に、システムが効果的なエラー管理を行うかどうかも確認します。

In ソフトウエアエンジニアリングストレステストは、しばしば以下の項目と並んで挙げられます。 耐久試験しかし、この2つには違いがあります。ストレス試験は、短時間で異常に高い負荷をかけて破壊点を見つけるのに対し、耐久(浸漬)試験は、適度な負荷を数時間かけて保持し、徐々に劣化していく様子を明らかにします。

以下のスクリーンショットは、ウェブページから大量のデータがコピーされている様子を示しています。

デスクトップアプリケーションに負荷をかけるため、ウェブページから非常に大きなデータブロックをコピーする

テスト対象のアプリケーションは、ウェブサイトから5GBのデータをコピーしてメモ帳に貼り付けると負荷がかかります。メモ帳は負荷がかかり、「応答なし」というエラーメッセージを返します。これは次のスクリーンショットに示されています。

メモ帳に5GBのデータを貼り付けた後、「応答なし」というエラーメッセージが表示される

同じ原理は、サーバー側のシステムにもそのまま適用できる。

ストレステストの必要性

ストレステストの活用が明確になる、以下の実際の事例を考えてみましょう。

  • フェスティバル期間中、オンラインショップping サイトへのアクセス数が急増したり、セールを発表したりすることがある。
  • ブログが大手新聞で言及されると、トラフィックが突然急増します。

このような異常なトラフィック急増に対応するためには、ストレステストを実施することが不可欠です。この急激なトラフィック増加に対応できない場合、収益と評判の損失につながる可能性があります。

ストレステストは、以下の理由からも非常に価値があります。

  • システムが異常な条件下でも正常に動作するかどうかを確認します。
  • システムに負荷がかかっている際に、適切なエラーメッセージが表示されることを確認します。
  • 極限状況下でのシステム障害は、莫大な収益損失につながる可能性がある。
  • 事前にストレステストを実施することで、極端な状況に備える方が良いでしょう。

次のセクションでは、ストレステストが成功するために証明しなければならない事項について説明します。

ストレステストの目標

ストレステストの目的は、システム障害発生後の動作を分析することです。ストレステストを成功させるには、システムが極限状態にあるときに適切なエラーメッセージを表示する必要があります。

ストレステストを実施する際には、膨大なデータセットが使用されることがありますが、システム障害発生時にそのデータが失われる可能性があります。テスターは、ストレステスト中にセキュリティ関連データが失われないようにする必要があります。

ストレステストの主な目的は、システムが障害発生後に復旧することを確認することであり、この特性は復旧性と呼ばれる。 回復テスト 次に、その復元手順を詳細に検証します。

負荷テストとストレステストの比較

どちらのテクニックも 性能試験 家族向けなので、混同しやすい。下の図は、2つの負荷プロファイルを比較したものである。

負荷試験の定常負荷プロファイルとストレス試験の漸増負荷プロファイルを比較したグラフ

負荷テスト ストレステスト
負荷テスト 通常のワークロード条件下でのシステム動作をテストし、実際に想定されるワークロードをシミュレートします。 ストレステストは、極限状態におけるシステムの動作をテストするもので、システムが故障するまで実施されます。
負荷テストはシステムを破壊しません。 ストレステストとは、大量のデータをシステムに送り込んだり、リソースを極端に不足させたりすることで、意図的にシステムを破壊しようとするテストである。

関連プロフィールには以下が含まれます スパイクテスト (突然の短い爆発) ボリュームテスト (多数のユーザーではなく、大量のデータ) スケーラビリティテスト (成長の余地がある)。

ストレステストの種類

以下に、ストレステストの種類を一つずつ説明します。

分散型ストレステスト

分散クライアント/サーバーシステムでは、サーバーからすべてのクライアントに対してテストが実行されます。ストレスサーバーの役割は、ストレステストのセットをすべてのストレスクライアントに配布し、 trackは各クライアントの状態を示します。クライアントがサーバーに接続すると、サーバーはクライアント名を追加し、テスト用のデータの送信を開始します。下の図は、ストレスサーバーが一部のクライアントには到達するものの、他のクライアントには到達しない様子を示しています。

ストレステストサーバーがクライアント1とクライアント2には到達するが、クライアント3とクライアント4との接続を失うという分散型ストレステスト設定

一方、クライアントマシンは、サーバーとの接続が維持されていることを確認する信号(ハートビート)を送信します。サーバーがクライアントマシンから信号を受信しない場合、そのマシンをデバッグのためにさらに調査する必要があります。図では、サーバーは2台のクライアント(Client1とClient2)とは接続できますが、Client3とClient4からは信号を送受信できません。

こうしたストレステストのシナリオでは、一晩かけて実行するのが最善の選択肢です。大規模なサーバーファームでは、調査が必要なストレス障害が発生したコンピューターをより効率的に特定する方法が必要です。

アプリケーションストレステスト

このテストは、単一のアプリケーションにおけるデータロックとブロッキング、ネットワークの問題、およびパフォーマンスのボトルネックに関連する欠陥の発見に重点を置いています。

取引ストレステスト

これは、2つ以上のアプリケーション間の1つ以上のトランザクションに対してストレステストを実行します。システムの微調整と最適化に使用されます。

全身性ストレス検査

これは、同一サーバーを共有する複数のシステム間で実行できる統合ストレステストです。あるアプリケーションが別のアプリケーションのデータ処理をブロックしてしまうような不具合を検出するために使用されます。

探索的ストレス試験

これは、実際のシナリオでは発生しそうにない異常なパラメータや条件下でシステムをテストするために使用されるストレステストの一種です。次のような予期せぬ状況における欠陥を発見するために使用されます。

  • 多数のユーザーが同時にログインしました。
  • 全てのマシンで同時にウイルススキャナーを起動します。
  • ウェブサイトからアクセスされている最中に、データベースがオフラインになる。
  • 大量のデータが同時にデータベースに挿入されている。

どちらのバリアントが適用されても、実行順序は同じです。

ストレステストはどうやって行うのですか?

ストレステストのプロセスは、主に以下の5つのステップで実行できます。

  • ステップ 1) ストレス テストを計画する: ここでは、システムデータを収集し、システムを分析し、ストレステストの目標を定義します。
  • ステップ 2) 自動化スクリプトを作成します。 このフェーズでは、ストレステストの自動化スクリプトを作成し、ストレスシナリオ用のテストデータを生成します。
  • ステップ 3) スクリプトの実行: この段階では、ストレステストの自動化スクリプトを実行し、ストレステストの結果を保存します。
  • ステップ 4) 結果分析: この段階では、ストレステストの結果を分析し、ボトルネックを特定します。
  • ステップ5)微調整と最適化: この段階では、目標とするベンチマークを満たすことを目指して、システムの微調整、構成の変更、コードの最適化を行います。

最後に、調整によって望ましい結果が得られたかどうかを判断するために、サイクル全体を再度実行します。たとえば、パフォーマンス目標が達成されるまでにストレス テスト プロセスを 3 ~ 4 サイクル実行する必要があることは珍しくないため、スクリプトは通常、 回帰 上。

ストレステストに推奨されるツール

以下の4つのツールは、エンタープライズ向けスイートから無料のオープンソースオプションまで、ほとんどのニーズに対応しています。

LoadRunner

LoadRunner は広く使われている負荷テストツールで、現在は OpenText HPからMicro Focusに移行した後、Professional、Enterprise、およびCloudエディションで OpenTextLoadRunnerによって生成された負荷テスト結果は、ベンチマークとして扱われます。

JMeter

Apache JMeter はオープンソースのテストツールです。 Java ストレスおよびパフォーマンス テスト用のアプリケーションであり、負荷、機能、ストレスなどのテスト タイプをカバーすることを目的としています。現在の 5.6.x リリースでは Apache JMeter 必要とする Java 8歳以降で、 Java 17件のおすすめ。

ストレステスター

このツールは、Webアプリケーションのパフォーマンスを詳細に分析し、結果をグラフィカルな形式で表示します。使い方も簡単です。高度なスクリプトは不要で、投資対効果は低く抑えられます。trac小規模チーム向け。

Neo負荷

Neo負荷、現在は Tricentis ポートフォリオは、Webと モバイルアプリケーション数千人のユーザーをシミュレートすることで、負荷がかかった状態でのアプリケーションのパフォーマンスを評価し、応答時間を分析できます。また、クラウド統合型のパフォーマンス、負荷、ストレステストをサポートし、拡張性にも優れています。

その他のオプションはガイドに記載されています パフォーマンステストツールどちらを選択しても、その出力は以下の指標に対してのみ意味を持ちます。

ストレステストの指標

メトリクスはシステムのパフォーマンスを評価するのに役立ち、一般的にストレステストの最後に分析されます。よく使用されるメトリクスは、大きく3つのグループに分類されます。

拡張性とパフォーマンスの測定

  • ページ/秒: 1秒あたりにリクエストされたページ数を測定します。
  • スループット: 基本的な指標としては、1秒あたりの応答データサイズが挙げられる。
  • ラウンド: テストシナリオが計画された回数と、クライアントが実際に実行した回数の比較。

アプリケーションレスポンス

  • ヒットタイム: 画像またはページを取得するのにかかる平均時間。
  • 最初のバイトまでの時間: データまたは情報の最初のバイトを返すのにかかる時間。
  • ページタイム: ページ上のすべての情報を取得するのにかかる時間。

失敗

  • 接続失敗: クライアントによって拒否された接続失敗数(信号が弱いため)。
  • 失敗したラウンド: 失敗したラウンド数。
  • 失敗したヒット: システムによる試行失敗回数(リンク切れまたは未表示画像)。

最後のセクションでは、ストレステストを実施することが最も正当化される状況を列挙しています。

ストレステストの例

ストレステストは、イベントによってトラフィックが日常の基準値を大幅に超えることが予想される場合に有効です。

  • フェスティバルセールを告知するECサイト。
  • 重大な出来事が発生した時点でのニュースウェブサイト。
  • 教育委員会が試験結果を公表する。
  • ソーシャルネットワーキングサイト、ブログ、モバイルアプリは、バイラル現象の際に活用される。

いずれの場合も、テストはメモリ、プロセッサ、ネットワークなどのリソースを監視し、負荷がかかった状態で適切なエラーメッセージが表示されることを確認し、その後システムが正常に戻ることを確認します。 ソフトウェアテストのライフサイクル 非機能チェックとして システムテスト そしてより広いセット ソフトウェアテストの種類.

よくあるご質問

いいえ。ストレス試験は、破壊点を見つけるために、短時間で異常に大きな負荷をかけるものです。浸すか 耐久試験 メモリリークや緩やかな劣化を明らかにするため、現実的な負荷を長時間保持します。

スパイクテスト ストレステストは、システムに突然かつ非常に短い負荷をかけ、システムがどれだけ速くスケールして回復するかを測定します。一方、ストレステストは、システムが故障するまで負荷を徐々に上げていくため、システムの反応速度ではなく、限界値がどこにあるのかを明らかにします。

メジャーリリース前、セールや決算発表日などのトラフィックピークが予測される前、キャッシュ、接続プーリング、オートスケーリングなどのアーキテクチャ変更後には必ず実行してください。多くのチームは、ベースラインチェックとして四半期ごとに繰り返し実行しています。

予算が許す限り、本番環境に近い規模の環境を使用してください。ハードウェアの規模が小さすぎると、限界点がずれてしまいます。本番環境のデータ量をマスク処理または合成データで置き換えて環境を構築し、実際の顧客データに対して破壊的なストレステストを実行しないでください。

機械学習モデルは、本番環境のテレメトリデータを分析して、現実的なピークトラフィックプロファイルを作成し、固定しきい値では見逃してしまうような異常な応答時間曲線を検出し、リソース指標を関連付けてボトルネックを特定します。現在、いくつかの商用プラットフォームでは、観測された使用パターンから負荷シナリオを生成しています。

はい。副操縦士のドラフト JMeter テスト計画、k6またはGatlingスクリプト、パラメータ付きデータジェネレータ、およびCIパイプラインステップを、平易な言語のプロンプトから生成します。出力はあくまでも最初のドラフトとして扱い、実行時間、ペース、およびアサーションはテスターに​​よる検証が必要であることを念頭に置いてください。

これにより、真の処理能力の上限が明らかになり、エラー処理が検証され、ピーク時の障害リスクが軽減されます。ただし、コスト面(本番環境やライセンス費用が高額であること)、スクリプト作成の手間、そしてインフラストラクチャの変更に伴って結果が変動するという制約があります。

パフォーマンスエンジニアまたは専門のテスターが実行し、通常は開発者と運用スタッフがサーバーメトリクスを読み取るために待機します。これは機能テストの後に配置されます。 システムテストビルドが十分に安定し、失敗がバグではなく容量の限界を示すようになったら。