前提条件
このチュートリアルでは、ArcGIS Server サービスに対して動的な負荷テストを作成および実行するための戦略と手順を説明しており、Apache JMeter の基本的な知識があることを前提としています。Apache JMeter を初めて使用する場合は、当社の Performance Testing with Apache JMeter (An Introduction) をご覧ください。

JMeter テスト戦略
データ駆動型負荷テストの構築と検証の詳細に入る前に、まず JMeter に特有のいくつかのテスト戦略について説明することが重要です。これらのヒントは、任意のテストツールで使用できる(しかし JMeter にも適用可能な)Recommended Strategies for Load Testing an ArcGIS Server Deployment 記事に記載されている項目とは異なります。
良いテストプランは適切なフォルダ構造から始まる
複数のテストや複数のレポートを管理する際に役立つ戦術の一つは、各テストのさまざまな要素を保存するためにシンプルで一貫したフォルダ構造を実装することです。JMeter テストの主なドライバーは JMX ファイルであり、ここにすべてのテストロジックが含まれています。しかし、機能を追加し続けて複数回実行すると、単一の JMX ファイルだけでは管理しきれなくなります。
少しの整理が大きな効果をもたらします…手動でいくつかの主要なディレクトリを作成することで、時間とともにハードドライブに蓄積されるさまざまな JMeter ファイルを管理しやすくなります。
注意: この方法はオペレーティングシステムのファイルシステム上で行い、Apache JMeter から直接行うものではありません。
推奨されるフォルダ構造:
- name_of_project(JMX ファイルは同じ名前でこの中に保存されるべきです)
- datasets
- 各テスト反復でリクエストを動的にするデータファイルが含まれます
- logs
- JMeter テスト環境のデバッグログが含まれます
- reports
- results
- JMeter テスト結果ファイルが含まれます
- これは生データ(RAW)結果ファイルであり、テストの最も重要な成果物です
- uploads
「project」フォルダ内には、datasets、logs、reports、results、および uploads の 5 つの空ディレクトリが作成されます。
ユーザー定義変数
上記のフォルダ構造と同様に、ユーザー定義変数を利用することは、移植性、再利用性、およびテストプラン共有を重視したテスト構築戦略です。ArcGIS サービステストでよく使われる一般的な変数には以下があります:
- ProjectFolder
- WebServerName
- ServerInstanceName
- SecurePort
- ServiceName
JMeter テストプラン内では、これらの変数は ${ServiceName} のような表記で簡単に参照でき、実行時にサービス名に自動的に置き換えられます。変数を使用することで、別環境でテストを使用する場合でもハードコーディングされた値よりもエラーが少なく済みます。別の展開先でテストを実行するときは、テスターは変数定義だけを調整すればよく、多数の HTTP リクエストサンプルが定義されたテストプランでは非常に時間を節約できます。
適切なスレッドグループの選択
ステップ負荷ロジックを定義する際にはいくつか選択肢があります。どれも似ていて基本的な機能は同じですが微妙な違いがあります。Thread Group はコア JMeter 製品に含まれており最大限のテスト移植性を提供する安全で良い選択肢です。
とはいえ、「Performance Testing with Apache JMeter (An Introduction)」でインストールされる JMeter Plugins Manager を使って「Custom Thread Groups」を追加すると、この分野で他にも便利なオプションが利用可能になります。
JMeter にカスタムスレッドグループサポートを追加する方法
JMeter 内の Plugins Manager(Options → Plugins Manager)から:
- Available Plugins を選択
- Custom Threads Groups を見つけて選択
- Apply Changes and Restart JMeter を選択して適用し再起動

Once the “Custom Thread Groups” plugin is installed, a recommended alternative over Thread Group is the bzm – Concurrency Thread Group, as it allows for a straightforward step configuration that visually renders the defined pressure which is a great validation feature from a testing point of view.
トランザクションを使ってリクエストをグループ化する方法
< P > テストにトランザクションを追加すると、
同じ「操作」に属する 1 つ以上の類似リクエスト をグループ化する便利な方法になります。例えばアプリケーションの読み込みやナビゲーションマップズーム、フォーム検索などです。このようなトランザクションを使うことで、その操作(例:フォーム検索)だけを担当するリクエストのみからなる論理的「コンテナ」に分離できるため分析が大幅に容易になります。一方、多くの異なる機能やサービス向けリクエストを一つの大きなグループにまとめてしまうと、テスト後の解析が非常に困難になります。トランザクションによって、それぞれの操作ごとのパフォーマンス理解が可能になります。< P >< STRONG >< FONT color="#FF0000">注意: マップアプリケーションやワークフローは多様であり、一部操作は多数リクエストからなるトランザクションで構成され、一部は単一リクエストのみの場合もあります。</ P >< P >< STRONG >< FONT color="#FF0000">注意: テスト内異なる操作のパフォーマンスは必ずしも同じようにスケールしません。あるものは他より良好かもしれません。ユニークなトランザクション名によって低パフォーマンス操作を特定できることは優れた分析となります。</ P >< H2 id = "toc-hId--1206735735">レスポンスが返されていることを検証する < P > リモートサーバーから期待したレスポンスが返ってくることを確認することはリクエスト送信と同じくらい重要です。ArcGIS リソース(サービスなど)をテストするときには様々な理由から HTTP ステータスコード(例:HTTP 200)のみでは不十分です。</ P >< P > レスポンス検証方法としてヘッダーやボディ内のキーワード検索があります。PNG イメージ要求時に代わりにテキスト形式エラーメッセージが返された場合、「image/png」をヘッダー内で探す Response Assertion ルールによって試行は
失敗(failed) とマークされます。ヘッダー内に存在すれば
成功(passed) と見なされます。</ P >< P >< STRONG >< FONT color="#FF0000">注意: JMeter テストプラン内で検査対象となるすべての HTTP リクエストには Response Assertion ルールを追加しなければなりません。</ P >< H1 id = "toc-hId--1217238839">JMeter でデータ駆動型 Export Map テスト作成 < P >< SPAN >上記戦略を用いて、ArcGIS マップサービスから毎回異なる関心領域を呼び出す柔軟かつ多用途な JMeter テストプランが作成できます。「動的テスト」は毎回同じデータ要求よりもサーバー資源への負荷が高まりやすく、このようなテストは実際の状況をよりよく表しています。</ P >< P > パフォーマンステスターとしては以下のような export map リクエスト署名から動的 JMeter 負荷テストへ変換したいと考えています:</ P >< P > </ P >< P > </ P >< P > </ P >< pre class = "lia-code-sample language-markup" >< code >
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show:0,1,2&bbox=-108.76228873935,31.0409016308382,-88.8526618315487,46.9686031570791&bboxSR=4326&imageSR=4326&size=1477,827&f=image< P > </ P >< P > </ P >< P > </ P >< P >< SPAN >JMeter は Test Plan 内 HTTP ペイロード構築方法として以下など複数手法があります:</ SPAN ></ P >< UL >< LI >< SPAN >手動によるリクエスト作成(例:手作業)</ SPAN ></ LI >< LI >< SPAN >組み込みレコーダーによるブラウザリクエスト直接キャプチャ</ SPAN ></ LI >< LI >< SPAN >インポート 別のソースから
この記事では、JMeterテストを手動で作成する方法の最初の方法に焦点を当て、リクエストのコンポーネントをどのように組み立て、その動作を「動的」にするかを説明します。このデータ駆動型テストは、エクスポート機能を通じてSampleWorldCitiesマップサービス(ローカル展開で実行中)を呼び出します。
注意:多くの指標で、SampleWorldCitiesは小規模で非常に軽量なマップサービスと見なされていますが、ArcGIS Server展開に普及しているため、負荷テストの作成手順を説明するのに理想的です。
新しいテストプランの作成と保存
- ファイルシステムから、上記のフォルダ構造を作成します:
- プロジェクトフォルダの名前はsampleworldcities1とします
- これは以下に存在すると仮定します:
- サポート用プロジェクトディレクトリを作成します:
- 例:datasets、logs、reports、results、uploads
- JMeterを起動します
- JMeterが作成した新しいテストプランを先ほど作成したsampleworldcities1フォルダに保存します
- テストプラン名:sampleworldcities1.jmx
- jmxテストプランのフルパスは以下と仮定します:
- C:\JMeter Tests\sampleworldcities1\sampleworldcities1.jmx

- ファイルシステムから見ると、プロジェクトフォルダは次のようになります:

テストプランへの変数追加
- JMeter内で、テストプラン(例:sampleworldcities1)をクリックします
- User Defined Variablesセクションの下部でAddをクリックします
- Nameに入力:ProjectFolder
- Valueに入力:C:\JMeter Tests\sampleworldcities1
- Nameに入力:WebServerName
- Valueに入力:yourwebadaptor.domain.com
- Web AdaptorまたはArcGIS Serverのホスト名を入力してください
- Nameに入力:ServerInstanceName
- Valueに入力:server
- 一部の展開では異なる値(例:arcgis)を使用する場合があります
- Nameに入力:SecurePort
- Valueに入力:443
- ArcGIS Serverインスタンスを指す場合は6443を使用してください
- Nameに入力:ServiceName
- Valueに入力:SampleWorldCities

bzm – Concurrency Thread Group をテストプランに追加
- sampleworldcities1 テストプランを右クリックし、Add-->Threads (Users)からbzm – Concurrency Thread Groupを選択します

- sampleworldcities1 テストプランの下でbzm – Concurrency Thread Group をクリックします
- 以下のステップロードロジックを設定します:
- Target Concurrency: 10
- Ramp Up Time (min): 20
- Ramp-Up Steps Counter: 10

bzm – Concurrency Thread Group プラグインでは、設定されたステップロードロジックが上記のチャートグラフィックで簡単に視覚的に確認できます。このテストは20分間実行され、10段階(2分ごとに同時テストスレッドを1つずつ追加)で負荷が増加し、最大10の同時テストスレッドに達した後停止します。
テストプランへのトランザクション追加
- bzm – Concurrency Thread Group を右クリックし、Add-->Logic ControllerからTransaction Controllerを選択します

- 追加後、Transaction Controller(例:ワークフロー操作)に意味のある名前を付けて他と区別できるようにします
- Name に入力:MapScale_9M
- 9M は地図縮尺9百万(例:1:9,244,649)を表しています
- このTransaction Controllerには一つ以上のHTTPリクエストを追加できます
- Transaction Controller セクションで「Generate parent sample」を選択します
- このオプションは、それぞれのリクエストがTransactionオブジェクト下に表示されるため検証に役立ちます

HTTPリクエストの追加
次に、それぞれ異なる空間範囲を要求するデータ駆動型HTTPリクエストを作成します。これは通常のJMeter HTTPリクエストで行います。
- MapScale_9MというTransaction Controller を右クリックし、Add-->SamplerからHTTP Request を選択します

- 新しい空のHTTPリクエストは以下のようになります:

HTTPリクエストを動的にする方法
export map のリクエスト署名例:
https://yourwebadaptor.domain.com/server/rest/services/SampleWorldCities/MapServer/export?dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=-108.76228873935%2C31.0409016308382%2C-88.8526618315487%2C46.9686031570791&bboxSR=4326&imageSR=4326&size=1477%2C827&f=image
このURLにはHTTPリクエストページ上で異なる場所へ割り当てる必要がある複数のURLコンポーネントが含まれています(柔軟性と保守性向上のため)。まずURLパラメータのキー/バリュー対から始めましょう。
以下のパラメータセクションは元の値ではなくいくつかのJMeter変数を含むよう修正されています。まだテスト内で作成されていないJMeter変数名が参照されていても問題ありません。
- 以下をコピーしてHTTP Request の下部「Add from Clipboard」に貼り付けます:
dpi=96&transparent=true&format=png32&layers=show%3A0%2C1%2C2&bbox=${bbox_9244649}&bboxSR=${sr_9244649}&imageSR=${sr_9244649}&size=${width_9244649}%2C${height_9244649}&f=image
これでHTTPリクエストの特定部分を動的にするために必要な複数要素が整います。
title="keyvaluepairs_httprequest.png" alt="keyvaluepairs_httprequest.png" "/><\/span><\/P>
- Web Server セクションの下:
- Protocol に入力: https<\/LI>
- Server Name or IP に入力: ${WebServerName}<\/LI>
- Port Number に入力: ${SecurePort}<\/LI><\/UL><\/LI>
- HTTP Request セクションの下:
- Path に入力: \/${ServerInstanceName}\/rest\/services\/${ServiceName}\/MapServer\/export<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>Response Assertion の追加<\/SPAN><\/H2>HTTP Request を右クリックし、Add-->Assertions の下で Response Assertion を選択<\/LI><\/UL>
<\/span><\/P>Response Assertion のいくつかのパラメータを変更:Field to Test の下で選択: Response Headers<\/LI>Pattern Matching Rules で選択: Contains<\/LI>Patterns to Test で、Add をクリックし入力: image\/png<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>CSV Data Set Config の追加<\/H2>Test Plan (例: sampleworldcities1) を右クリックし、Add-->Config Element の下で CSV Data Set Config を選択<\/LI><\/UL>
<\/span><\/P>CSV Data Set Config を選択し、名前を CSV Data Set Config -- 9M に変更複数のデータファイルがテスト内で使用される場合(例:各地図スケールのバウンディングボックス用ファイル)に、ユニークな名前を付けることでメンテナンスや管理が容易になる<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P>テキストエディタを使用して、空の CSV ファイルに以下の16行のデータを入力:<\/SPAN><\/LI><\/UL>bbox,width,height,mapUnits,sr,scale<\/SPAN><\/FONT><\/P>"-108.76228873935,31.0409016308382,-88.8526618315487,46.9686031570791",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"23.1282001284589,34.337748761293,43.03782703626,50.2654502875339",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"-117.052786808947,35.3545948648786,-97.1431599011459,51.2822963911194",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"-100.83549484975,36.0637839078502,-80.9258679419492,51.991485434091",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"17.7030587822399,34.3302705716379,37.6126856900409,50.2579720978788",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"32.2827904735659,37.2792197897781,52.192417381367,53.2069213160189",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"0.222469446585188,35.0562794764081,20.1320963543862,50.9839810026489",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"100.262489726575,20.8660021309943,120.172116634376,36.7937036572352",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\/FONT><\/P>"72.4186084471192,22.1748804724666,92.3282353549203,38.1025819987075",1280,1024,esriDecimalDegrees,4326,9244649<\/SPAN><\ 時間(応答時間)<\/LI>サイズ(バイト単位)(ヘッダーとボディ)<\/LI>エラー数<\/LI>応答コード<\/LI>ContentType<\/LI><\/UL><\/LI><\/UL><\/LI><\/UL>注意:この情報はテスト再生の検証に非常に役立ちますが、パフォーマンスのトラブルシューティングにも有用です。<\/FONT><\/STRONG><\/P>
<\/span><\/P>このテストはexport map機能を実行しているため、要求された画像の可視化もTest Planの検証に役立ちます。Response dataタブをクリックし、MapScale_9Mトランザクションを展開すると、要求された画像が表示されるはずです。他のMapScale_9Mトランザクションについても必要に応じて繰り返してください。<\/LI><\/UL><\/LI>複数のリクエストを切り替えることで異なる画像が表示され、JMeterでのデータ駆動型export map負荷テストの作成が検証されます。<\/LI><\/UL><\/LI><\/UL>
<\/span><\/P> <\/P>
<\/span><\/P>最近の変更を保存する<\/H2>前回の保存以降、多くの変更が行われました。<\/P>Test Planを保存するファイル-->保存<\/LI><\/UL><\/LI><\/UL>この記事で使用したApache JMeter Test Planをダウンロードするには、こちらをご覧ください: sampleworldcities1.zip<\/A><\/P>より詳細で追加のmap scaleをカバーしたApache JMeter Test Planのバージョンをダウンロードするには、こちらをご覧ください:
sampleworldcities2.zip<\/A><\/P>