はじめに

こんにちは!業務でAPI負荷テストを担当することになり、JMeterを使用しました。

今回はJMeterのインストールからGUIの基本操作、よく使う用語の解説、そしてCSV Data Set Configやスループットコントローラといった便利な機能の概要までをまとめていきます。

1. JMeterとは

Apach JMeterとはWebアプリケーションやAPIに対して負荷テストを行うためのオープンソースツールです。

「同時に何人がアクセスしたらどうなるか」「レスポンスは何秒以内に返ってくるか」といったことを測定でき、GUIで直感的にテストシナリオを作成することができます。

2. インストール方法(ダウンロード〜起動まで)

まずは前提としてJava 8以上がインストールされていることを確認してください。
java -version
でバージョンが表示されていればOKです。

インストールされていない場合は、macだとHomebrewを使用して
brew cask install adoptopenjdk
でインストールが可能です。

これでJMeterをインストールする準備が整いました!ここからJMeterを入れていきます。

ダウンロードと起動

JMeterの準備は以下になります。

  1.  Apache JMeter公式サイト からBinarieszipをダウンロード
  2. zipを解凍
  3. bin フォルダ内のファイルを実行
    • Mac: jmeter.sh

起動すると左側のツリーに「テスト計画(Test Plan)」が表示されます。

この画面で設定をしていく形になります!

3. 基本用語の説明

JMeterを使う上で出てくる用語になります。

テスト計画

テスト全体の入れ物です。全ての設定やテストシナリオはこの中に配置します。

ユーザー定義変数

テスト計画全体で使い回す値を変数として定義できる機能です。

テスト計画の画面にあり、下にある「追加」ボタンを押すと追加することができます。
例えばホスト名やAPIキーなどを変数にしておけば複数のリクエストで同じ値を使い回すことができ、変更も一箇所で済みます!

 

スレッドグループ

仮想ユーザの振る舞いを定義する単位になります。

テスト計画を右クリック → threads(Users)→ スレッドグループから追加できます。
ここでは「何人のユーザーが」「どのくらいの時間」リクエストを送り続けるかを設定します。

スレッドグループ内で設定するものは下記になります。

項目 説明
サンプラーエラー後のアクション
  • エラーが発生したときの挙動を設定

「続行」にしておくとエラーが起きても次のリクエストを続けるため、負荷テスト中にどの程度エラーが出るかを計測したい場合に使用します

スレッド数
  • 仮想ユーザー数を設定
Ramp-Up期間(秒)
  • 全スレッドが起動するまでの時間を設定

いきなり全スレッドを同時起動するとサーバーに急激な負荷がかかるため、Ramp-Up期間を設けて徐々に負荷を上げていきます
(スレッド数18・Ramp-Up 60秒なら60秒かけて1スレッドずつ段階的に起動することができます)

ループ回数
  • 各スレッドの繰り返し回数(イテレーション)

-1 で無限ループに設定が可能です

持続時間(秒)
  • テストの実行時間(Schedulerを有効にした場合に設定可能)
same user on each iteration
  • イテレーション(繰り返しの1回分)ごとに同じ仮想ユーザーを使うかどうかの設定

チェックを外すと毎回新しいユーザーとして扱われ、Cookieやセッション情報がリセットされます

Delay thread creation until  needed
  • スレッドの生成タイミングの設定

チェックを入れること実際にスレッドが起動するタイミングまでスレッドオブジェクトの生成を遅らせることが可能です
(大量スレッド時のメモリ節約などに有効)

スケジューラ
  • 持続時間や開始・終了時刻を設定

チェックを入れるとテストの実行時間を「持続時間(秒)」で指定が可能です
(1800と入力すると30分間リクエストを送り続ける設定になります)

 

ヘッダーマネージャ

HTTPリクエストに任意のヘッダーを追加できる機能です。APIテストではAuthorization(認証トークン)やContent-Type(リクエストボディの形式)を指定することが多く、ほぼ必須と言える設定エレメントです。

追加方法はHTTPリクエストを右クリック → 追加 → 設定エレメント → HTTPヘッダマネージャから追加できます。

設定画面では「名前」と「値」の形式でヘッダーを追加できます。例えばJSON形式のAPIを叩く場合は下の画像のように設定します。

${api_token}のようにユーザー定義変数で設定した値を参照することもできるので、トークンの管理が楽になります!

アサーションThroughput

レスポンスが期待通りかを検証する要素です。

テスト計画やスレッドグループを右クリック → threads(Users)→ スレッドグループから追加できます。

  • レスポンスアサーション … ステータスコードが200であること等を検証
  • 持続時間アサーションレスポンスタイムが指定ミリ秒以内であることを検証

リスナー(Listener)

テスト結果を集計・表示する要素です。「統計レポート」や「Summary Report」でリクエストごとの平均応答時間、エラー率、スループット(1秒あたりの処理リクエスト数)などを確認できます。

4. 基本的な使い方

大体の用語がわかったので、GUIで実際に操作してみましょう!

要素の追加方法

親要素を右クリックして「追加」メニューから選択します。

  • スレッドグループの追加: テスト計画を右クリック追加スレッド(ユーザー) → スレッドグループ
  • HTTPリクエストの追加: スレッドグループを右クリック追加サンプラー → HTTPリクエスト
  • ヘッダマネージャの追加: HTTPリクエストを右クリック追加設定エレメント → HTTPヘッダマネージャ
  • アサーションの追加: HTTPリクエストを右クリック追加アサーションレスポンスアサーション
  • リスナーの追加: テスト計画を右クリック追加リスナー統計レポート

スレッドグループの逐次実行

テスト計画の「スレッドグループを別々に実行(Run Thread Groups consecutively)」にチェックを入れると、スレッドグループが上から順番に実行されます。
たとえば「ログイン → 商品検索 → 購入」のように順番に実行したいシナリオがあった場合はチェックを入れる必要があります。

知っておくと便利な機能

  • CSV Data Set Config

テストデータを外部CSVファイルから読み込む機能です。リクエストボディにデータをハードコードする代わりに、CSVから動的にデータを差し込めます。

例えば以下のようなCSVを用意して、(ファイル名はsample.csv)

U001,1001,10

U002,1002,10

U003,1003,20

CSV Data Set Configで Variable Names に name_id,user_id,branch_cd と設定すると、リクエストボディで ${user_id}${branch_cd} のように変数として参照できます。
リクエストごとにCSVの次の行が読み込まれるので、異なるデータで繰り返しテストが可能です。

CSVファイルは参照ボタンから入れることができます!

なお数値型は ${user_id}(クォートなし)、文字列型は "${name_id}"(クォートあり)で記述する点に注意してください。

スループットコントローラ

リクエストの実行比率を制御する機能です。
名前に「スループット」とついていますが、リスナーで確認できる指標のスループット(1秒あたりの処理リクエスト数)とは別物です!

「全フィールド更新70%、必須のみ更新30%」のように、種類の異なるリクエストを指定した割合で混在させることができます。

スレッドグループを右クリック → 追加 → ロジックコントローラ → スループットコントローラから追加できます。
設定方法としてはスレッドグループの中に複数のスループットコントローラを配置し、それぞれに実行割合(Percent Executions)を設定します。
比率の合計は100%になるようにしてください。

おわりに

この記事ではJMeterの導入から基本用語、GUIの使い方、そしてCSV Data Set Configとスループットコントローラの概要を紹介しました。
はじめは操作に手こずりましたがGUIでの操作について学ぶことができました!