ソフトウェアの開発工程では、システムが仕様通りに動くことだけでなく、システムの性能がユーザーの利用に耐えうるかの確認も欠かせません。
開発者によるテストでいくら仕様書通りに動いていても、ユーザーの利用状況に即した処理速度やボリュームでデータを処理できなければ、顧客満足度を低下させてしまいます。
今回は、負荷テストなどのWebシステムの性能テストに関して、その種類や実施目的、テスト手法の特徴についてご紹介します。
- もくじ
1.性能テスト(パフォーマンステスト)とは
性能テスト(Performance Testing)とは、システムのデータ処理速度や一度に処理可能なデータ量がユーザー利用に即した仕様になっているかを確認するテストです。
性能テストを実施するにあたっては、性能テストの難しさと実施目的を正しく理解する必要があります。
1-1 性能テストの難しさ
性能テストは、実際のユーザーの利用状況を想定した環境で実施されるため、データを準備したり、テストを実行する状況を作り出したりすることが大きな負担となる場合も少なくありません。
例えば、数千・数万件規模のデータを同時に処理する状況が想定されるシステムでは、そのデータ量の負荷に耐えることができるかを検証するために、膨大なデータの登録・処理の作業が発生します。
また、性能テストでは「パフォーマンス」という一見曖昧な指標を具体的なテスト項目に落とし込んで評価を行います。ユーザーのユースケースや具体的な利用者数・アクセス数などが想定できていないと、適切な評価を行うことができません。
システムの処理速度の例を挙げると、システムの性質を考慮せずに「応答時間3秒以内」という指標を採用してしまうというケースが見られます。
もし競合サービスの応答時間が1秒以内の場合、ユーザーは速度が遅すぎると判断してサービスから離脱してしまう可能性も考えられます。
性能テストの評価基準は慎重に考慮する必要があるわけです。
1-2 性能テストを行う目的
性能テストは、単体テストや結合テストで実施されるような、いわゆる機能テストとは全く異なる観点のソフトウェアテストです。
機能テストでは、仕様書や設計書に基づいた正しい動きをしているかどうかがポイントになります。
一方の性能テストは、「ユーザーが快適に利用できるかどうか」という点に着目し、実際の利用想定に基づいてシステムのデータ処理や応答速度のボトルネックとなる箇所を検出することを目指しています。
例えば、「処理速度が遅い」という問題1つ取っても、システムのどの部分がどんな原因で速度低下につながっているのかが分からなければ、改善のしようがありません。データ量がネックになっているのか、複数ユーザーが同時にアクセスすることが原因なのかなど、性能劣化を引き起こす条件を突き止めることが性能テストの目的です。
特定の条件下でシステムが正常な動きをしていたとしても、ユーザー利用に応じた性能要件を満たしていないとシステムを利用してもらうことはできません。
近年は、応答時間が数秒長くなっただけで、ユーザーの離脱率が上昇するため、システムの性能を保証することの重要性が高まっています。
2.目的に応じた3種類の性能テスト
性能を測るテストには、通常の状態での処理速度や同時処理数を検証するものに加えて、システムが高負荷の状態にあるときの性能を検証するテストがあります。これを負荷テストと呼びます。
負荷テストはその目的に応じてストレステストとロードテストの2つに分類されます。
その他、システムの性能改善の時期や要件を調査するためのテストとして拡張性テストがあります。
それぞれの実施目的や特徴について、比較しながら見ていきましょう。
2-1 ストレステスト
ストレステストとは、想定以上の同時アクセス数や処理データ量などに対して、システムがどのような挙動をするのか確認するテストを指します。
万が一、システムに想定を超えた負荷が加わった場合には、処理速度の低下・エラーで処理が停止するなどの動きをするべきです。
しかし、システムによってはデータの不整合が発生する、システムエラーで処理が中断するなど、望ましくない挙動が見られる場合があります。
想定外の状況が発生した際にも、データの損失などの取り返しのつかない事態になることを防ぐため、ストレステストは必須のテストであると言えます。
2-2 ロードテスト
ロードテストとは、想定される上限に限りなく近いアクセスを受けたり、最大ボリュームのデータ処理を行ったりした際に、定義した要件通りの挙動をするかを確認するテストです。
このテストは、システムに対してより現実的な負荷をかけた状況でのシステムの処理能力を測ることを目的としており、ストレステストとは異なります。
ストレステストでは想定以上の負荷をかけた際のシステムの動作を確認するのに対して、ロードテストでは「システムが正常に動作すると想定できる最大負荷」をかけた際に仕様通りに動作するかを確認します。
2-3 拡張性テスト
ここまで、ストレステストとロードテスト、2つのタイプの負荷テストを見ていきました。
それに対して、拡張性テストとは、長期的なスパンでシステムが許容できる性能要件を見極めることに焦点をおいたテストです。
例えば、「将来的にユーザー数やデータベースのデータ量が増加したときに、どのレベルまで対応できるか」といった視点でテストを実施します。
想定される最大、もしくはそれ以上の負荷を与えて行うストレステストやロードテストとは異なり、処理可能なデータ量やアクセス数を確認することが目的です。
拡張性の限界を把握することによって、しきい値を設定して、これを超えたときにアラートを通知する、将来の負荷増加に備えてサーバー台数を増やすといった事前準備を行えるようになります。
3.状況に応じて組み合わせて実施することが重要
性能テストは3種類に大別できると述べましたが、これらの手法はどれか1つを取り上げて行えば良いというわけではありません。
ユーザーの利用に耐えうるシステムを作り上げるため、状況や目的に応じて複数のテストを組み合わせて実施します。
性能テストを実施する際の重要なポイントは、テストの実施目的を明確にするとともに、ユーザーの利用想定に基づいた観点を洗い出しておくことです。目的に応じたデータ準備と確認項目の設定をすることで、性能テストの効果を最大化できるでしょう。
また、大量データを扱ったり複数アクセスのテストを行ったりする場合、テスト環境構築の負担が大きくなるため、一度に複数観点のテストを行う方が効率的です。
まとめ
今回は性能テストの実施目的や代表的なテスト手法についてご紹介しました。
性能テスト(Performance Testing)とは、システムのデータ処理速度や一度に処理可能なデータ量がユーザー利用に沿った仕様になっているかを確認するテストです。
性能テストには、高負荷状態におけるシステムの性能を確認するための、ストレステストおよびロードテストといった負荷テストの他、システムの性能改善の時期や要件を調査するための拡張性テストがあります。
負荷テストをはじめとする性能テストを実施する際は、ユーザーの利用状況を明確に把握し、適切なテスト環境の準備や期待値の設定が重要です。
性能テストの代表的な3つの分類とその違いを把握し、テストに臨むようにしましょう。