ソフトウェア品質保証において、パフォーマンステストとは、一般的に、特定のワークロード下でのシステムの応答性と安定性のパフォーマンスを判断するために実行されるテスト手法です。 [ 1 ]また、スケーラビリティ、信頼性、リソース使用率など、システムの他の品質属性を調査、測定、検証、または検証するためにも役立ちます。
パフォーマンス エンジニアリングのサブセットであるパフォーマンス テストは、システムの実装、設計、アーキテクチャにパフォーマンス標準を組み込むことを目指すコンピュータ サイエンスの実践です。
負荷下での動作を検査するテストは、ベースラインテスト、負荷テスト、ストレステスト、ソークテスト、スモークテスト、アイソレーションテストの6つの基本的な種類に分類されます[ 2 ] : 38–39 。これらの基本的な種類に加えて、構成テストやインターネットテストを行うこともできます。
ベースラインテストは、他の種類のテスト(例えばストレステスト)の比較ポイントを作成するために使用されます。「最良のケース」(例えば5人の同時ユーザーのみ)におけるシステムの反応を測定することで、他の種類のテストで最悪のケースにおけるパフォーマンスの低下を比較することができます。
負荷テストは、パフォーマンステストの最もシンプルな形式です。負荷テストは通常、特定の想定負荷下でのシステムの動作を把握するために実施されます。この負荷とは、設定された期間内に特定のトランザクション数を実行するアプリケーションの想定同時ユーザー数を指します。このテストでは、ビジネスクリティカルなすべてのトランザクションの応答時間を測定し、データベースやアプリケーションサーバーなども監視します。これは、アプリケーションソフトウェアや、そのソフトウェアがインストールされているハードウェアの ボトルネックを特定するのに役立ちます。
ストレステストは通常、システム内の容量の上限を把握するために使用されます。この種のテストは、極端な負荷に対するシステムの堅牢性を判断するために行われ、アプリケーション管理者が、現在の負荷が予想される最大値を大幅に上回った場合でもシステムが十分に機能するかどうかを判断するのに役立ちます。
スパイクテストは、ストレステストの特殊な形態であり、非常に多くのユーザーによって生成される負荷を突然増加または減少させ、システムの動作を観察することによって行われます。その目的は、パフォーマンスが低下するか、システムが故障するか、あるいは負荷の急激な変化に対応できるかを判断することです。
ブレークポイントテストもストレステストの一種です。システムが所定の障害条件を満たしているか監視しながら、時間の経過とともに段階的に負荷をかけて負荷をかけます。ブレークポイントテストは、システムが要求仕様やサービスレベルアグリーメント(SLA)を満たすための最大キャパシティを決定することから、キャパシティテストと呼ばれることもあります。固定環境に適用されたブレークポイント分析の結果は、必要なハードウェアやクラウド環境でスケールアウトイベントをトリガーする条件の観点から、最適なスケーリング戦略を決定するために活用できます。
ソークテスト(耐久テストまたは安定性テストとも呼ばれる)は、通常、システムが想定される継続的な負荷に耐えられるかどうかを判断するために行われます。ソークテスト中は、メモリ使用率を監視し、潜在的なメモリリークを検出します。また、重要でありながら見落とされがちなのがパフォーマンスの低下です。これは、長時間の継続的なアクティビティ後のスループットや応答時間が、テスト開始時と同等かそれ以上であることを確認することです。ソークテストでは、基本的に、システムにかなりの負荷を長時間かけて適用します。その目的は、システムが継続的な使用下でどのように動作するかを確認することです。
分離テストはパフォーマンステストに特有のものではありませんが、システムの問題を引き起こしたテスト実行を繰り返すことで、多くの場合、障害領域を分離して確認することができます。
負荷の観点からパフォーマンスをテストするのではなく、システムコンポーネントの構成変更がシステムのパフォーマンスと動作に及ぼす影響を判断するためにテストが作成されます。一般的な例としては、さまざまな負荷分散手法を試すことが挙げられます。
これは比較的新しいパフォーマンステストの形態であり、Facebook、Google、Wikipediaなどのグローバルアプリケーションのパフォーマンスを、実際のターゲット大陸に設置された負荷ジェネレータ(物理マシンまたはクラウドVM)からテストします。これらのテストを正常に実行するには、通常、膨大な準備と監視が必要です。
パフォーマンス テストはさまざまな目的に使用できます。
多くのパフォーマンステストは、十分に現実的で目標指向的なパフォーマンス目標を設定せずに実施されています。ビジネスの観点から最初に問うべきことは、「なぜパフォーマンステストを行うのか?」です。これらの考慮事項は、テストのビジネスケースの一部です。パフォーマンス目標はシステムのテクノロジーと目的によって異なりますが、必ず以下の項目を含める必要があります。
システムが何らかのログイン手順によってエンドユーザーを識別する場合、同時実行性の目標設定は非常に望ましいものです。定義上、同時実行性は、システムが特定の時点でサポートすることが期待されるシステムユーザーの最大同時実行数です。スクリプト化されたトランザクションのワークフローは、特に反復的な部分にログインとログアウトのアクティビティが含まれている場合、 真の同時実行性に影響を与える可能性があります。
システムにエンドユーザーの概念がない場合、パフォーマンス目標は最大スループットまたはトランザクション レートに基づく可能性が高くなります。
これは、あるシステムノードが別のノードからのリクエストに応答するまでにかかる時間を指します。簡単な例としては、ブラウザクライアントからウェブサーバーへのHTTP「GET」リクエストが挙げられます。応答時間という点では、これはすべての負荷テストツールが実際に測定するものです。システムの全ノード間でサーバー応答時間の目標を設定することが適切である場合があります。
負荷テストツールは、一般的にノード内で何が起こっているかを把握しておらず、ネットワーク上でアクティビティがない期間を認識することしかできないため、レンダリング応答時間の測定が困難です。レンダリング応答時間を測定するには、通常、パフォーマンステストシナリオに機能テストスクリプトを含める必要があります。多くの負荷テストツールは、この機能を提供していません。
パフォーマンス仕様(要件)を詳細に定義し、パフォーマンステスト計画に文書化することは非常に重要です。理想的には、システム開発プロジェクトにおける要件定義フェーズ、つまり設計作業に着手する前の段階で実施するのが良いでしょう。詳細については、 「パフォーマンスエンジニアリング」をご覧ください。
応答時間、同時実行性などのパフォーマンス仕様は、通常、サービスレベルアグリーメント(SLA)に規定されます。[ 2 ] : 24 また、テストケースのパフォーマンスを前回の実行結果と比較することで、回帰を特定することもできます。パフォーマンス測定は非決定論的であるため、パフォーマンス回帰を検出するには、パフォーマンステストのワークロードを適切に繰り返し実行し、適切な統計的検定を実施する必要があります。[ 3 ]
さらに、パフォーマンステストは、パフォーマンスプロファイルのチューニングプロセスの一環として頻繁に使用されます。その目的は、ボトルネック(システムのどの部分で応答速度を向上すればシステム全体の動作速度が向上するか)を特定することです。システムのどの部分がこのクリティカルパスであるかを特定することは困難な場合があります。一部のテストツールには、サーバー(エージェント)上で実行されるインストルメンテーション(またはアドオン機能)が組み込まれており、トランザクション時間、データベースアクセス時間、ネットワークオーバーヘッド、その他のサーバーモニターをレポートし、生のパフォーマンス統計情報と組み合わせて分析できます。このようなインストルメンテーションがなければ、システム監視に頼らざるを得なくなる可能性があります。
パフォーマンス テストは Web 上で実行できます。また、インターネット自体の応答時間は地域によって異なることが知られているため、国内のさまざまな場所で実行することもできます。社内で実行することも可能ですが、その場合はルーターを設定して、パブリック ネットワークで一般的に発生する遅延を発生させる必要があります。負荷は、現実的なポイントからシステムに導入する必要があります。たとえば、システムのユーザー ベースの 50% が 56K モデム接続経由でシステムにアクセスし、残りの半分がT1経由でアクセスする場合、負荷インジェクター (実際のユーザーをシミュレートするコンピューター) は、同じ接続の組み合わせで負荷を注入するか (理想的)、同じユーザー プロファイルに従って、そのような接続のネットワーク遅延をシミュレートする必要があります。
ピーク時にシステムを利用すると予想されるピーク時のユーザー数を明確にしておくことは、常に役立ちます。また、許容される最大95パーセンタイル応答時間についても明確にしておくことができれば、インジェクター構成を用いて、提案されたシステムがその仕様を満たしているかどうかをテストできます。
パフォーマンス仕様では、少なくとも次の質問をする必要があります。
可能な限り実稼働環境に類似したシステムの安定したビルド。
一貫した結果を得るためには、パフォーマンステスト環境は、ユーザー受け入れテスト(UAT)や開発環境などの他の環境から分離する必要があります。ベストプラクティスとして、本番環境に可能な限り類似した独立したパフォーマンステスト環境を用意することが推奨されます。
パフォーマンステストでは、テスト環境を想定される実際の使用状況に近づけることが非常に重要になります。しかし、実際には、本番システムは予測不可能なワークロードにさらされるため、これを調整するのは困難であり、完全に実現できるわけではありません。テストワークロードは、本番環境で発生する事象を可能な限り模倣しますが、このワークロードの変動性を正確に再現できるのは、最もシンプルなシステムに限られます。
疎結合アーキテクチャ実装(例:SOA)は、パフォーマンステストの複雑さをさらに増大させています。本番環境に近い状態を忠実に再現するには、共通のインフラストラクチャまたはプラットフォームを共有するエンタープライズサービスまたはアセットにおいて、すべてのコンシューマーが共有インフラストラクチャまたはプラットフォーム上で本番環境に近いトランザクション量と負荷を発生させる、協調的なパフォーマンステストが必要です。この作業は非常に複雑で、費用と時間の両方がかかるため、一部の組織では、パフォーマンステスト環境(PTE)において本番環境に近い状態(「ノイズ」とも呼ばれます)を監視およびシミュレートするツールを導入し、キャパシティとリソースの要件を把握し、品質特性を検証・検証しています。
新システムのコストパフォーマンスを向上するには、開発プロジェクトの開始から導入までパフォーマンステストの取り組みを継続的に実施することが不可欠です。パフォーマンス上の欠陥の検出が遅れるほど、修正コストは増大します。これは機能テストにも当てはまりますが、エンドツーエンドで実施されるパフォーマンステストでは、その範囲が複雑であるため、さらに顕著になります。テスト環境やその他の主要なパフォーマンス要件の取得と準備には時間がかかるため、パフォーマンステストチームは可能な限り早期にプロジェクトに参画することが不可欠です。
パフォーマンス テストは、主に次の 2 つのカテゴリに分けられます。
パフォーマンステストのこの部分では、主に、特定された主要なビジネスプロセスのワークフローの作成/スクリプト化を行います。これは、様々なツールを使用して行うことができます。
上記のリスト(網羅的でも完全でもありません)に記載されているツールはいずれも、スクリプト言語(C、Java、JS)または何らかの視覚的表現(ドラッグ&ドロップ)を用いて、エンドユーザーのワークフローを作成・シミュレートします。ほとんどのツールは「記録と再生」と呼ばれる機能を備えており、パフォーマンステスターはテストツールを起動し、ブラウザまたはシッククライアントに接続して、クライアントとサーバー間で発生するすべてのネットワークトランザクションをキャプチャします。これにより、様々なビジネスシナリオをエミュレートするために拡張・修正可能なスクリプトが作成されます。
これはパフォーマンステストのもう一つの側面です。パフォーマンス監視では、テスト対象アプリケーションの動作と応答特性を観察します。パフォーマンステストの実行中は通常、以下のパラメータが監視されます。
サーバーハードウェアパラメータ
最初のステップとして、これら4つのパラメータによって生成されるパターンは、ボトルネックがどこにあるのかを示す優れた指標となります。問題の正確な根本原因を特定するために、ソフトウェアエンジニアはプロファイラーなどのツールを使用して、デバイスまたはソフトウェアのどの部分がパフォーマンスの低下に最も寄与しているかを測定したり、許容可能な応答時間を維持するためのスループットレベル(およびしきい値)を設定したりします。
パフォーマンステスト技術では、1台以上のPCまたはUnixサーバーをインジェクターとして利用し、各インジェクターが多数のユーザーの存在をエミュレートし、パフォーマンステスト対象のホストとの一連の自動インタラクション(スクリプトとして記録されるか、さまざまな種類のユーザーインタラクションをエミュレートする一連のスクリプトとして記録されます)を実行します。通常、別のPCがテストコンダクターとして機能し、各インジェクターからのメトリクスを調整・収集し、レポート作成用にパフォーマンスデータを照合します。通常の手順は、負荷を徐々に増加させることです。つまり、少数の仮想ユーザーから開始し、時間の経過とともにユーザー数を所定の最大値まで増やします。テスト結果は、ユーザー数と応答時間の関係で、負荷に応じてパフォーマンスがどのように変化するかを示します。このようなテストを実行するためのツールは様々あります。このカテゴリのツールは通常、実際のユーザーをシステムに対してエミュレートする一連のテストを実行します。結果から異常が明らかになる場合もあります。例えば、平均応答時間は許容範囲内であっても、いくつかの重要なトランザクションに異常値があり、完了までにかなり長い時間がかかる場合があります。これは、データベースクエリや画像などの非効率性が原因である可能性があります。
パフォーマンステストはストレステストと組み合わせて実施することで、許容負荷を超えた場合に何が起こるかを確認できます。システムはクラッシュしますか?大きな負荷を軽減した場合、回復にどれくらいの時間がかかりますか?システムの障害によって付随的な損害は発生しますか?
分析的パフォーマンス モデリングは、システムの動作をスプレッドシートでモデル化する方法です。このモデルには、トランザクション リソース需要 ( CPU、ディスク I/O、LAN、WAN ) の測定値が、トランザクション ミックス (1 時間あたりのビジネス トランザクション数) で重み付けされて入力されます。重み付けされたトランザクション リソース需要を合計して 1 時間あたりのリソース需要を取得し、1 時間あたりのリソース容量で割ってリソース負荷を取得します。応答時間の式 (R=S/(1-U)、R=応答時間、S=サービス時間、U=負荷) を使用して応答時間を計算し、パフォーマンス テストの結果を使用して調整できます。分析的パフォーマンス モデリングにより、実際または予想されるビジネス使用に基づいて設計オプションとシステム サイズを評価できます。そのため、ハードウェア プラットフォームを完全に理解している必要がありますが、パフォーマンス テストよりもはるかに高速で安価です。
このようなテストを実行するタスクには次のようなものがあります。
Microsoft Developer Network によれば、パフォーマンス テスト方法論は次のアクティビティで構成されます。