【負荷テスト】ロードテストについて（Apache JMeter）

## 負荷テストの種類
負荷テストには目的ごとに、以下のような種類のテストがあります。
- ロードテスト
- ストレステスト
- ボリュームテスト
- 耐久テスト
など

今回は、これらのうちロードテストについてまとめます。
## 負荷テストの目的
そもそも負荷テストの目的は何なのか。次のような目的があります。

1\. パフォーマンスの評価: 
アプリケーションが予想されるトラフィックやユーザー数の増加に対して、どの程度の負荷を処理できるかを評価します。これにより、ユーザーが快適な体験を維持できるかどうかを確認します。

2\. スケーラビリティの評価: 
アプリケーションが追加のハードウェアリソースやインフラストラクチャの拡張によってどの程度スケールアップできるかを評価します。これにより、将来の成長や需要の増加に対応できるかどうかを判断します。

3\. ボトルネックの特定: 
負荷テストは、アプリケーションのボトルネックや性能上の制約を特定するための手段でもあります。システム内の特定の要素やコンポーネントが高負荷下で優れたパフォーマンスを発揮できない場合、その問題を特定して改善することが重要です。

4\. 可用性の確認: 
アプリケーションが長時間の負荷下で正常に動作し続けるかどうかを確認します。システムの耐久性や冗長性をテストし、障害発生時の回復力やサービスの可用性を評価します。

これらの目的を達成するために、負荷テストでは異なる負荷レベルやシナリオをシミュレートし、アプリケーションの性能と挙動を評価します。

### （補足：トラフィックとは）
トラフィックは、データの送信量や動きを指す。具体的には、データのパケット数やサイズ、ユーザーのアクセス頻度や同時接続数などが含まれる。トラフィックはネットワークの使用状況や負荷を評価するための指標であり、ネットワークのパフォーマンスや応答性に影響を与える。また、ウェブサイトやアプリケーションの開発や運用においても重要であり、トラフィックの予測や管理が必要とされる。トラフィックの正確な理解と適切な管理は、ネットワークやアプリケーションのパフォーマンスやセキュリティの確保に重要な役割を果たす。

## ロードテストの目的

ロードテストは、前述の負荷テストの目的のうち、次の目的を達成するためのテストです。

>1\. パフォーマンスの評価: 
アプリケーションが予想されるトラフィックやユーザー数の増加に対して、どの程度の負荷を処理できるかを評価します。これにより、ユーザーが快適な体験を維持できるかどうかを確認します。

ロードテストによって、アプリケーションの応答時間やスループットなどのパフォーマンス指標を測定し、負荷の上限や性能の限界を特定することが目的です。ロードテストにおいては、ユーザー数やトラフィック量、リクエストの頻度などを設定し、アプリケーションがどの程度の負荷を処理できるかを検証します。ロードテストの結果を分析することで、アプリケーションのパフォーマンス改善やインフラストラクチャの最適化のための情報を得ることができます。

なお、スケーラビリティの評価やボトルネックの特定、可用性の確認もロードテストに関連する目的ですが、直接的には「パフォーマンスの評価」に含まれる概念となります。

## JMeterを使用したロードテストの手順

JMeterを使用してロードテストを行う際の手順を以下に示します。

1. テスト計画の作成: JMeterを起動し、新しいテスト計画を作成します。

2. スレッドグループの設定: テスト計画内にスレッドグループを作成します。スレッドグループは、同時に実行されるユーザーの数やループ回数などを定義します。

3. HTTPリクエストの追加: スレッドグループの下にHTTPリクエストを追加します。これは、テストするウェブアプリケーションのエンドポイントやリクエストの詳細を指定します。

4. 必要なパラメータの設定: リクエスト内のパラメータやヘッダーを設定します。これには、ユーザー名やパスワード、フォームデータなどが含まれます。

5. テストデータの設定: 必要に応じて、CSVファイルなどの外部データソースからテストデータを読み込み、リクエストに動的な値を設定することができます。

6. リクエストの分析とレポート: 必要な場合は、リクエストの応答時間やエラーコードなどの情報を収集し、結果を分析するためのリスナーを追加します。

7. スレッドグループとテストの設定: スレッドグループの設定で、同時実行ユーザー数やループ回数、リソース制約などのテストの条件を設定します。

8. テストの実行: テスト計画全体を実行して、ロードテストを開始します。JMeterは、指定されたユーザー数やリクエストの頻度に基づいて負荷をかけます。

9. テスト結果の分析: テストの実行後、JMeterは結果データを収集し、グラフやレポート形式で表示します。これにより、応答時間、スループット、エラー率などを評価し、アプリケーションのパフォーマンスを分析することができます。

10. 上記の手順は一般的なJMeterの使用例ですが、テスト計画や要件によって異なる場合もあります。JMeterには多くの機能と設定オプションがあり、さまざまなシナリオやテストケースに対応できる柔軟性があります。

### （シナリオ、要件、テスト結果、分析結果の例）
具体的なロードテストのシナリオ、要件、テスト結果、および分析結果は、特定のアプリケーションやシステムの要件や環境に依存します。したがって、具体的な例を提供することはできませんが、少しでも例があった方がわかりやすいと思うので、簡単な例を示します。

**1シナリオ:**

- ウェブアプリケーションのホームページへのアクセス
- ログイン操作
- 商品の検索と表示
- カートに商品を追加
- 注文の確定

**2要件:**
- 同時に最大1000ユーザーのアクセスをシミュレートする
- アクセス頻度は平均して1秒に10リクエスト
- 応答時間は2秒以内に維持する

**3テスト結果:**
- ユーザー数: 最大1000ユーザー
- リクエスト頻度: 平均して1秒に10リクエスト
- 応答時間: 平均2秒、最大5秒

**4分析結果:**
- リクエストの応答時間が2秒以内に維持されており、要件を満たしている。
- ユーザー数やリクエスト頻度が増加すると、応答時間が長くなる傾向がある。
- 特定のリクエストやページでボトルネックが発生しており、改善が必要。

### （要件の言い換え）
上記の要件を、JMeterの測定結果を比較してわかりやすくするために、要件の言い換えをします。

>- 同時に最大1000ユーザーのアクセスをシミュレートする
>- アクセス頻度は平均して1秒に10リクエスト
>- 応答時間は2秒以内に維持する

↓

>- スレッド数: 最大1000スレッド
>- ループ回数: 無制限または指定された回数のループ
>- ランプアップ期間: ユーザーの増加を1秒間に10ユーザーずつ増やす
>- スループット: 平均して1秒に10リクエストを実行する
>- 応答時間: 2秒以内に応答を受ける

↓　したがって、JMeterでの要件は次のようになります:

>- スレッド数: 1000
>- ループ回数: 無制限または指定された回数
>- ランプアップ期間: 10ユーザー/秒
>- スループット: 10リクエスト/秒
>- 応答時間: 2秒以内

## まとめ

ロードテストでは、応答時間やスループットなどのパフォーマンス指標を測定し、負荷の上限や性能の限界を特定します。設定したユーザー数やトラフィック量でアプリケーションがどの程度の負荷を処理できるかを検証します。結果を分析して、パフォーマンス改善やインフラストラクチャの最適化に役立つ情報を得ることができます。

テストの実施、結果の分析の際には、要件の言い換えをすると考えやすいです。要件を、スレッド数、ループ回数、ランプアップ期間、スループット、応答時間などに整理することが大切と思われます。