「負荷テスト」とは、システム開発におけるテスト手法のひとつで、制作したシステムが様々な状況下で安定して動作することを確認するためのテストです。
負荷テストには「ロードテスト(性能テスト)」「ストレステスト(限界テスト)」など複数の種類、手法があり、目的に応じて使い分ける必要があります。
本記事では、負荷テストを適切に実施するための手法の使い分けや具体的な作業のステップ、作業時の注意点などを紹介します。
負荷テストとは何か
はじめに、システム開発における負荷テストの目的、役割や、負荷テストにどのような種類、手法があるか、について説明します。
負荷テストの目的(機能テストとの違い)
負荷テストはシステムの負荷に注目したテストです。
システムの負荷には、「同時接続数(同時アクセス数)」「データ件数」「データサイズ」などがあり、システムの負荷が変わってもシステムが正しく動作することをテストします。
機能テストはシステムのロジックの正しさを対象としたテストであるため、システムの負荷に起因する不具合は発見できません。
機能テストでシステムのロジックが正しいことを確認し、負荷テストでシステムの負荷が変わっても正しく動作することを確認します。両方がそろってはじめて「システムが正しく動作している」と言えます。
負荷テストの種類
負荷テストには以下の4種類があります。それぞれのテストで目的と観点が異なるため、内容を理解して適切に使い分ける必要があります。
1. ロードテスト(性能テスト)
ロードテストでは、システムの処理能力が、性能要件を満たしていることを判断します。テスト環境に対して性能要件に指定した「システムの負荷」をかけた状態でテストを実施します。
性能要件の例としては、実運用時に想定される「システムの負荷(同時接続数)」と、その状況でのシステムの「応答時間」の組み合わせなどがあります。
■検索機能の応答時間に関する性能要件の例
・通常時(同時接続ユーザー数50):応答時間3秒以内
・ピーク時(同時接続ユーザー数100):応答時間7秒以内
2. ストレステスト(限界テスト)
ストレステストでは、対象システムに負荷をかけて、限界値の確認および限界値に達したときのシステムの動作をテストします。
限界値の確認では、サーバーリソースやスループットの限界値の確認と、限界に達したときのボトルネックの特定を行います。限界値に達したときのシステムの動作確認では、システムが処理できる負荷を超えた場合でも、システム障害につながるような異常が発生しないことをテストします。
■テスト要件の例
大量のアクセスによりシステムがタイムアウトを起こした場合、システム停止せず、あらかじめ想定したエラーが発生すること。
システムにかける負荷の量には、「運用で想定している負荷の上限」「運用で想定している範囲を超えた大きな負荷」などがあり、サーバーのコストや作業量などを元に、プロジェクトごとに取り決めます。
3. ボリュームテスト
ボリュームテストは、ファイルサーバーやデータベースに対して、大量のデータが入った状態でシステムの性能に変化がないことをテストするものです。
4. 耐久テスト(連続稼働テスト)
耐久テストは、長時間の連続稼働によって、パフォーマンスの低下やメモリリークなどの問題が生じないかをテストします。
負荷テストの注意点:プロジェクト全体で一貫性を持つ
システム開発プロジェクトで負荷テストを実施する際には、プロジェクト全体で一貫性を持つことに注意が必要です。
ここで言う「一貫性」とは、負荷テストの目標値の設定や負荷テストの種類の選定基準などが、プロジェクト全体で統一されていることを指します。
担当者によって目標値に差異があったり、使用する負荷テストの種類が異なっていたりすると、システム全体として適切な負荷テストを行ったことにはなりません。
また、負荷テストの内容が統一されていない場合、見積が正確に行えないため、コストやスケジュールにも悪影響が出る可能性があります。プロジェクト全体で適切に計画や設計を進めることで、費用対効果が高く、無駄のない負荷テストを実施できます。
負荷テストの進め方、その方法について
ここからは、負荷テストの進め方について、各ステップでの注意点を交えて具体的に紹介します。
負荷テストのステップを確認する
負荷テストに対して、「JMeter」のようなツールを実行するだけ、というイメージを持たれている方がいるかもしれませんが、ツールの実行は、負荷テストのほんの一部でしかありません。
適切な負荷テストは、「1. 計画⇒2. 設計⇒3. 環境構築・準備⇒4. 実施⇒5. 分析」というステップを正しく実施することではじめて実現が可能となります。
各ステップで実施する作業は以下の通りです。
1. 計画
テスト計画では、実施する負荷テストの「目標」「テスト方式」「体制」「スケジュール」を検討します。
2. 設計
設計のステップでは、テスト計画で決定したテストを適切に実施するため、テストシナリオ(テストスクリプト)やテストデータなどの準備を行います。
3. 環境構築・準備
テスト環境を構築し、負荷の生成準備、負荷テスト用のテストスクリプトやテストデータの配置と動作確認、負荷テストの結果を収集するための監視設定等を行います。
4. 実施
準備ができたらテストを実施します。
5. 分析
テスト結果を分析し、テストの合否判定および不合格の場合の原因調査等を行います。
各ステップには、負荷テストの知見と実施経験を持ったメンバーを割り当てます。作業期間はシステムの規模にもよりますが、複数名の体制で数か月、といった期間になる場合もあります。
負荷テストの注意点:システム構成を把握する
負荷テストにおいて、システム構成を把握することは重要です。システム構成とは、システムのネットワーク構成、ハードウェアやOS、ミドルウェア、連携するアプリケーションなどを指します。
システム構成を把握しておくことで、テスト設計における負荷を発生させるポイントの設定や、テスト分析におけるボトルネックの特定などを正確かつ迅速に行うことができるようになります。
シナリオから、リスクの診断方法を探る
負荷テストを実施する対象の画面、機能を選定する方法を説明します。
1. シナリオの洗い出し
「シナリオ」とは、システムを使用して業務を行う時の一連の操作(機能や画面遷移)を指します。
2. シナリオのリスク評価
洗い出したシナリオに対してリスク評価を行います。
リスク評価は「利用頻度の高さ」と「障害が発生した場合の影響度」を元に行います。
利用頻度の高さに該当するシナリオは、システムを利用するユーザーの主要な動線であるため、障害発生時に影響を受けるユーザー数が多いことから、重要度が高くなります。
障害が発生した場合の影響度に該当するシナリオは、関連する業務の停止、売上機会の損失、企業イメージの低下など、障害発生時のビジネス上のインパクトが大きいことから、重要度が高くなります。
3. 優先順位の設定
リスク分析結果を元に、テストの優先順位を設定します。
一般的には上位5%のリスクを解消できれば、全体の70%~80%が解消される、と言われており、実施効果の高いシナリオを選定していくことが大切です。
負荷テストの準備
テスト設計のステップでは、テスト計画で選定したシナリオを元に準備を行います。
1. テストスクリプトの作成
テスト計画に基づき、負荷テストを実行するためのスクリプトを作成します。
設定する条件の例は以下の通りです。
- リクエスト、トランザクションの定義
- 負荷量(スレッド数)やRamp-Up期間
- リクエスト実行毎の滞留時間
- ログの出力設定
- シナリオの定義
これらの条件を組み合わせてテストパターンとしてまとめます。
負荷テストツールの「JMeter」では、テストパターンごとにJMXファイルを作成します。
2. テストデータの準備
テスト用のデータを準備します。データの件数や容量などがテストの前提条件に沿っていることを確認します。
3. 監視項目の設定
テスト結果を取得・分析するための監視項目を設定します。
取得する情報は負荷テストの種類によって異なります。
例)性能テストの場合:応答時間、同時接続数
限界テストの場合:サーバーリソース、応答時間、エラーログ
負荷テストの注意点:実運用環境の負荷を確認する
負荷テスト実施に際しては、実運用環境の状態を確認し、できるだけ同じ条件で負荷テストを実施することが重要です。
実運用環境の状態の中で、特に確認が必要な条件は以下の通りです。
- 処理のピーク時間
曜日、時間帯、ピークの持続時間など - ピーク時に発生する処理量
単位時間あたりのリクエスト数
単位時間あたりのデータ処理件数、ページ数、データサイズ
新規サービスの構築時には、確認すべき実運用環境がありませんが、負荷テストの種類や内容を決めるためには必ず条件を設定する必要があります。
想定データ件数や見込みアクセス数などを元に条件を設定します。
専門家への依頼も一案です
自社内での負荷テスト体制を構築・維持したい場合、以下のような課題へ対応する必要があります。
- テスト計画、テスト設計等の知見を持つ専門家の育成
- 適切なテストスクリプトの作成とメンテナンスに要する工数
- 負荷テスト環境の構築、テストを実施し、リアルタイム監視するためのノウハウ
- テスト結果の確認、解析、問題の抽出するための知識
いずれの課題対応にもそれなりのコストや人数が必要であり、容易ではないと思われます。重要なシステムの負荷テストにおいては、多少費用がかかっても、知識と経験を持った外部の専門家による支援を受けることもプロジェクトの成功に向けた一案ではないでしょうか。
性能テストについてはこちらの記事もおすすめです。
さらに、システム開発については「GeNEE」でも発信しているので、良ければ参考にしてください。