本投稿は TECOTEC Advent Calendar 2024 の21日目の記事です。
はじめに
こんにちは!次世代デジタル基盤開発事業部の川俣です。私は普段フロントエンドエンジニアとして Web開発案件を中心に業務に携わっています。また、この記事は同じ次世代デジタル基盤開発事業部でPM兼エンジニアとして業務に携わっている安彦と共に執筆しました。
最近、仕事でシステムの負荷試験を行う機会があり、その際にApache JMeterを活用しました。活用するにあたって、周りに知見のある方を探したところ、JMeterを使ったことがある人があまり多くありませんでした。
なので、これから負荷試験を始めようとしている方々は、どこから手をつければいいのか迷ってしまうかもしれません。そこで、今回はJMeterを使った負荷試験の実際の手順や、便利な機能について、私が業務で実際に経験したことを元に詳しく紹介したいと思います。
事前準備
JMeterを使用するにあたって、事前に準備しなければならないことがあるので、そちらについて解説します。
JMeter のインストール
jmeter.apache.org まず初めに、JMeterのインストール方法について説明します。上記のURLが公式Webサイトのダウンロードページです。
私はzip形式のバイナリをダウンロードしました。
Java のインストール
続いてJavaのインストール方法について解説します。 JMeterはJavaアプリケーションのため、Javaをインストールしなければ使うことができません。 Javaのインストール方法はこちらなどを参考にしてみてください。
デフォルトの言語を日本語にする
最後にデフォルトの言語を日本語にする方法について解説します。 先ほどダウンロードしたJMeterファイルを開き、その中にあるbinファイルを開きます。そして、その中のjmeter.bat というファイルをテキストエディタで開き、
- set JMETER_LANGUAGE:="-Duser.language=en -Duser.region=EN" + set JMETER_LANGUAGE:="-Duser.language=ja -Duser.region=JP"
このように記述を変更します。こうすることで、今後JMeterを開くと常に日本語で表示されるようになります。
基本的な使い方(手順説明とそれぞれの役割説明)
テスト計画
テスト計画はJMeterを起動した際にデフォルトで作成されています。こちらの配下に負荷試験を行いたい内容を作成していきます。
スレッドグループ
テスト計画の配下に最初に作成するのがスレッドグループです。スレッドグループでは、負荷試験を行う際の負荷を設定することができます。作成方法は、テスト計画を右クリックし、「追加」→「Threads」→「スレッドグループ」の順に選択することで作成できます。
スレッドグループの内容を見てみると、「スレッド数」「Ramp-up 期間 (秒)」「ループ回数」の3箇所に値を選択する欄があります。
- スレッド数
- 一回のテストケースで生成されるスレッドの数
- Ramp-up 期間 (秒)
- 何秒で全スレッドを生成するかを指定する
- ループ回数
- 1 つのシナリオ(スレッド)を何回繰り返すかを指定する
これらを使用して負荷の内容を設定していきます。
HTTP リクエスト
HTTPリクエストはスレッドグループの配下に作成します。作成方法は、スレッドグループを右クリックし、「追加」→「サンプラー」→「HTTPリクエスト」の順に選択することで作成できます。
HTTPリクエストの内容を見てみると、「プロトコル」「サーバー名またはIP」「ポート番号」「パス」「parameters」の5箇所に必要事項を入力する箇所があるのでそれぞれに、適切な内容を入力しましょう。parametersには、リクエストで使用したい内容を記載するのですが、その際にJSON形式で記述したい場合は、Body Dataの方に記述しましょう(parametersかBody Dataのどちらかにしか内容は記載できません)。また、HTTPメソッドを選択する箇所もあるので、こちらも適切なものを選択しましょう。
結果表示用リスナー
結果表示用リスナーは、スレッドグループかHTTPリクエストの配下に作成します。スレッドグループの配下に作成すると、配下にある全てのHTTPリクエストの結果を表示することができます。HTTPリクエストの配下に作成すると、作成元にあるHTTPリクエストの結果のみを表示することができます。
従って、全体を通して結果を確認したい場合は、スレッドグループ配下に作成する。単体での結果を見たい場合は、HTTPリクエスト配下に作成することをおすすめします。 結果表示用リスナーの作成方法は、スレッドグループもしくはHTTPリクエストを右クリックし、「追加」→「リスナー」→「結果をツリーで表示する」の順に選択することで作成できます。
結果の確認方法についても軽く説明しておきます。 今回は、「結果をツリーで表示する」を使用して説明します。下画像の様に、赤いバツマークと緑のチェックマークが表示され、赤いバツマークは、データの取得失敗を意味し、緑のチェックマークはデータ取得成功を意味します。
また、「結果をツリーで表示する」を使用した場合は、応答データの部分を見てみると、正しく情報が取れているかどうかやエラーの原因などを確認することができるのでおすすめです。
テスト計画から結果分析まで
次にJMeterを使って、どのように負荷試験を行ったのか説明します。
シナリオ選定
今回は既存システムのリプレイスを行う案件のため、処理が大きく変わるAPIや新規APIのうち代表的なAPIを選んでシナリオを選定しました。
- API単体での選定基準
- 最も多くの画面で呼び出されるGET系のAPI
- ユースケースのメインとなる処理を含むPOST/PUT系のAPI
- ログインAPI
- 外部サービスとの接続があるAPIは除外
- モック化することで、実施できるため工数と相談が必要です
- 複数APIを使ったシナリオの選定基準
- システム価値を提供する最小限のシナリオ
- 一般的なユースケースに対応するシナリオ
選定したシナリオを表にまとめて、関係者に以下の観点でレビューしてもらいます。
- シナリオ選定基準に準拠しているか
- バックエンドエンジニア観点でAPI実行順が正しいか
- 非機能要件に基づいた目標値になっているか
- 非機能要件よりも項目が細かくなるので、処理内容(参照/一覧/更新)や外部連携の有無で決定していくと進めやすいと思います
- データの用意が完了しているか
シナリオファイルの作成
上記で決定した各シナリオについてjmxファイルを作成します。 弊社では、我々アプリケーションエンジニアがシナリオファイル作成までを行い、目標値に対するスレッドグループ設定や実際のテスト実施をインフラエンジニアが行います。
従って、各テストシナリオが最低限のスレッドグループで動作するところまでをシナリオ作成のゴールとしました。
テスト実施と結果の分析
前述のとおり、弊社では、テスト実施をインフラエンジニアが担当します。 Distributed Load Testing on AWS を用いて、リモート環境に負荷をかけます。使用する環境に意図しないリクエストが発生しないよう関係者と調整しておきましょう。
続いて、結果の分析です。これも基本的にインフラエンジニアに解析してもらい、各APIについて必要な対応を検討します。
その他機能など
ユーザー定義変数
ユーザー定義変数は、テスト計画やスレッドグループ配下に作成します。そうすることで、その配下にある全ての要素にユーザー定義変数で定義された変数を反映させることができます。ユーザー定義変数の作成方法は、テスト計画やスレッドグループを右クリックし、「追加」→「設定エレメント」→「ユーザー定義変数」の順に選択することで作成できます。
変数の作成方法は、ユーザー定義変数を開いて画面下の方にある追加ボタンを押すと、変数を定義する枠ができるので、その枠の中に変数名と値をそれぞれ適した場所に記載することで作成できます。
使用方法は、ユーザー定義変数で定義した変数名を、使用した場所で${}という形を用意し、{}内に変数名を書き込むことで使用できるようになります。
HTTP ヘッダマネージャ
ヘッダマネージャは、スレッドグループ配下に作成します。そうすることで、その配下にある全ての要素にヘッダマネージャで定義された内容を反映させることができます。ヘッダマネージャでは、負荷試験で使用するHTTPヘッダーの内容を管理することができます。ヘッダマネージャの作成方法は、スレッドグループを右クリックし、「追加」→「設定エレメント」→「ヘッダマネージャ」の順に選択することで作成できます。
ヘッダーの作成方法は、ヘッダマネージャを開いて画面下の方にある追加ボタンを押すと、ヘッダーを追加する枠ができるので、その中にヘッダーの名前と値をそれぞれ適した場所に記載することで作成できます。
正規表現抽出
正規表現抽出は、スレッドグループやHTTPリクエスト配下に作成します。そうすることで、正規表現にして抽出した内容を変数に格納し、使用したいリクエストなどで使用できます。正規表現抽出の作成方法は、スレッドグループやHTTPリクエストを右クリックし、「追加」 →「 後処理」 → 「正規表現抽出」といった手順で作成できます。
正規表現の抽出方法は、「参照名」に呼び出すときの名前(変数名)、「正規表現」に抽出したい内容、「テンプレート」に該当箇所が複数個ある場合に何番目のものを抽出するのか、「一致番号」に複数行該当する場合に何行目を抽出するのか、「初期値」に出力できなかった時に表示するデフォルト値を記載することで、抽出できます。
git での管理方法
マルチリポジトリだったため、API サーバのリポジトリ内に、JMeter ディレクトリを切り、その中に負荷試験関連のファイルを格納しました。
GUIで編集したjmxファイルはXML形式のため、git管理下に置いて、コードエディタで開くことで一括置換などの操作ができて便利です。
docker 環境構築
PJメンバー各自でJMeterを導入するのは手間なので、docker 上に実行環境を作れるよう準備します。 https://github.com/justb4/docker-jmeter を元に docker 環境を構築しました。 Alpine Linux をベースにしたDockerfileのためCUIですが、 JMeterのレポートダッシュボード作成機能 が使えるため、結果をグラフ付きでHTMLファイルとして出力可能です。
CSV Data Set Config
CSV Data Set Configは、HTTPリクエスト配下に作成します。そうすることで、csvファイルの内容を参照させることができます。CSV Data Set Configの作成方法は、HTTPリクエストを右クリックし、「追加」→「設定エレメント」→「CSV Data Set Config」の順に選択することで作成できます。
CSVファイルの参照方法は、filenameの横にある参照ボタンを押し、参照したいCSVファイルを選択することで参照できます。
おわりに
いかがだったでしょうか。この記事では、JMeterを使用したことがない方でも簡単にJMeterが使用できるようにポイントをまとめてお伝えしました。 JMeterは無料で使用できる負荷試験ツールのため選択肢に入るケースが多いと思います。本記事がJMeter利用の参考になれば幸いです。 最後までご覧いただきありがとうございました。 それではみなさま、メリークリスマス。
テコテックの採用活動について
テコテックでは新卒採用、中途採用共に積極的に募集をしています。 採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。 ご興味を持っていただけましたら是非ご覧ください。 tecotec.co.jp