Apache JMeter を使用するロード テストを計画する
このセクションでは、ロード テストについて確認し、パイプラインにロード テストを追加する方法について学習します。 ロード テストでは、Apache JMeter を使用して、Web アプリに同時にアクセスする複数のユーザーをシミュレートします。 テストでは、"ステージング" 環境の Azure App Service で実行されているアプリから Web コンテンツをフェッチします。
Tim は、ラップトップに Apache JMeter ユーザー インターフェイスを表示することから開始します。 彼は基本的なテスト計画を実行します。 次に、Tim と Mara は、コマンド ラインから実行できるファイルにテスト計画をエクスポートします。 最後に、彼らは "ステージング" 中にロード テストを実行するために Azure Pipelines にタスクを追加します。
Note
簡潔にするために、ローカル コンピューターに Apache JMeter をインストールする必要はありません。 そのまま読み続けてください。
Apache JMeter からロード テストを実行する
Apache JMeter は、パフォーマンスの分析や測定を行うオープンソースのロードテスト用ツールです。 生成されるレポートは XML ファイルです。
Azure Pipelines は、Apache JMeter レポートを読み取り、グラフを生成できます。 これらのテストを実行するのに特別なハードウェアは必要ないため、Microsoft ホステッド エージェントを使用してテストを実行できます。 Space Game のシナリオでは、ステージングでこれらのテストを実行することになるでしょう。
テスト計画を作成する
次に示すのは Linux を実行しているラップトップでの Apache JMeter の様子です。
新しいテスト計画ファイル (たとえば、LoadTest.jmx) を作成します。 次に、ファイルにスレッド グループを追加します。 シミュレートされた各ユーザーが、独自のスレッドで実行しています。 スレッド グループでは、ユーザーの数と各ユーザーの要求数が制御されています。
次の例は、10 人のシミュレートされたユーザー (スレッド) を示しています。 各ユーザーが 10 個の要求を行うので、システムは合計 100 個の要求を受け取ります。
"サンプラー" は、JMeter によって行われる 1つの要求です。 JMeter では、HTTP、FTP、TCP、および他のいくつかのプロトコルを使用してサーバーに対してクエリを実行できます。 サンプラーでは、レポートに追加される結果が生成されます。
次に、スレッド グループに HTTP 要求の既定値と HTTP 要求サンプラーを追加します。 Azure App Service のステージング環境で実行される Space Game Web サイトのホスト名を指定します。
上記のシナリオでは、基本的なテスト計画を作成します。
テスト計画を実行する
JMeter を使用すると、多くの種類のテストを実行できます。 テスト計画は、JMeter のグラフィカル ユーザー インターフェイスから実行できます。 ただし、ロード テストの場合、JMeter のドキュメントでは、コマンド ラインからテスト計画を実行することが推奨されています。
次のコマンドを使用して、テスト計画を実行します。
apache-jmeter-5.4.1/bin/./jmeter -n -t LoadTest.jmx -o Results.xml
-n
引数は、JMeter を非 GUI モードで実行することを指定します。 -t
引数では、テスト計画ファイル LoadTest.jmx を指定します。 -o
引数では、レポート ファイル Results.xml を指定します。
JMeter が実行され、レポート ファイル Results.xml が生成されます。 このファイルの例では、最初のいくつかの結果を示しています。
<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
<httpSample t="180" it="0" lt="95" ct="35" ts="1569306009772" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40871" sby="144" ng="1" na="1">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="174" it="0" lt="96" ct="38" ts="1569306009955" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40869" sby="144" ng="1" na="1">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
<httpSample t="160" it="0" lt="121" ct="35" ts="1569306010131" s="true" lb="HTTP Request" rc="200" rm="OK" tn="Thread Group 1-1" dt="text" by="40879" sby="144" ng="2" na="2">
<java.net.URL>http://tailspin-space-game-web-staging-1234.azurewebsites.net/</java.net.URL>
</httpSample>
各サンプルによって、レポートにノードが生成されます。 t
属性では、応答時間をミリ秒 (ms) 単位で指定しています。 ここでは、それぞれ 180 ミリ秒、174 ミリ秒、160 ミリ秒を要した 3 つの要求が確認できます。
理想的な要求時間は、平均して 1 秒未満である必要があります。 1 秒より長くかかるのは、要求の 10% を超えないようにする必要があります。 JMeter は、最小、最大、および平均の応答時間や標準偏差などの統計を報告するように構成できます。 この情報を提供するのに役立つスクリプトを作成することができます。
テスト結果を視覚化するには、テスト結果に Azure Pipelines が認識できる形式を与える必要があります。 Azure Pipelines で、テスト結果が含まれた XML ファイルを解析できますが、ファイルは、サポートされる形式になっている必要があります。 サポートされている形式としては、CTest、JUnit (PHPUnit を含む)、NUnit 2、NUnit 3、Visual Studio Test (TRX)、xUnit 2 があります。 JMeter の結果を JUnit に変換する XSLT ファイルを作成できます。
レポートを JUnit に変換する
XSLT は、"XSL 変換"、または Extensible Stylesheet Language Transformation を表します。 XSLT ファイルは XML ファイルに似ていますが、これを使用すると、XML ドキュメントを別の XML 形式に変換できます。
ロード テストに関する要件を思い出しましょう。
- 平均要求時間は 1 秒未満でなければならない。
- 1 秒より長くかかるのは、要求の 10% を超えないようにする必要があります。
これらの要件を満たす XSLT ファイルは次のようになります。
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:math="http://exslt.org/math">
<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
<xsl:template match="/testResults">
<xsl:variable name="times" select="./httpSample/@t" />
<xsl:variable name="failures" select="./httpSample/assertionResult/failureMessage" />
<xsl:variable name="threshold" select="1000" />
<testsuite>
<xsl:attribute name="tests"><xsl:value-of select="count($times)" /></xsl:attribute>
<xsl:attribute name="failures"><xsl:value-of select="count($failures)" /></xsl:attribute>
<testcase>
<xsl:variable name="avg-time" select="sum($times) div count($times)" />
<xsl:attribute name="name">Average Response Time</xsl:attribute>
<xsl:attribute name="time"><xsl:value-of select="format-number($avg-time div 1000,'#.##')"/></xsl:attribute>
<xsl:if test="$avg-time > $threshold">
<failure>Average response time of <xsl:value-of select="format-number($avg-time,'#.##')"/> exceeds <xsl:value-of select="$threshold"/> ms threshold.</failure>
</xsl:if>
</testcase>
<testcase>
<xsl:variable name="exceeds-threshold" select="count($times[. > $threshold])" />
<xsl:attribute name="name">Max Response Time</xsl:attribute>
<xsl:attribute name="time"><xsl:value-of select="math:max($times) div 1000"/></xsl:attribute>
<xsl:if test="$exceeds-threshold > count($times) * 0.1">
<failure><xsl:value-of select="format-number($exceeds-threshold div count($times) * 100,'#.##')"/>% of requests exceed <xsl:value-of select="$threshold"/> ms threshold.</failure>
</xsl:if>
</testcase>
</testsuite>
</xsl:template>
</xsl:stylesheet>
ここでは、XSL がどのように機能するかについては詳しく説明しません。 要約すると、このファイルでは、最初に JMeter 出力から次のデータが収集されます。
各 HTTP 要求の時間。
各
httpSample
からt
属性を選択することで、このデータが収集されます。 (./httpSample/@t
)各失敗メッセージ。
このデータは、ドキュメントからすべての
failureMessage
ノードを選択することによって収集されます。 (./httpSample/assertionResult/failureMessage
)
また、XSLT ファイルでは、しきい値が 1,000 ミリ秒に設定されます。 この応答時間は、先ほど定義した最大値です。
これらの変数を指定すると、XSLT ファイルによって、テストの合計数と失敗の合計数が示されます。 その後、次の 2 つのテスト ケースが提供されます。
- 平均応答時間と、平均が 1,000 ミリ秒のしきい値を超えた場合に失敗。
- 最大応答時間と、1,000 ミリ秒のしきい値を超える要求数が 10% を超えた場合に失敗。
XSLT の結果は、Azure Pipelines で認識される JUnit 形式に一致します。 XSLT ファイルに JMeter2JUnit.xsl という名前を付けます。
次に、XSLT プロセッサが必要になります。 この例では、XSLT スタイルシートを XML ドキュメントに適用するためのコマンドライン ツールである xsltproc を使用します。
xsltproc は次のようにインストールできます。
sudo apt-get install xsltproc
次に、xsltproc を実行して JMeter レポートを JUnit に変換します。
xsltproc JMeter2JUnit.xsl Results.xml > JUnit.xml
結果として得られた JUnit ファイル JUnit.xml を次に示します。
<?xml version="1.0" encoding="UTF-8"?>
<testsuite xmlns:math="http://exslt.org/math" tests="100" failures="0">
<testcase name="Average Response Time" time="0.17"/>
<testcase name="Max Response Time" time="0.373"/>
</testsuite>
この例では、平均応答時間は 170 ミリ秒です。 最大応答時間は 373 ミリ秒です。 時間は両方とも 1,000 ミリ秒のしきい値を下回っているため、どちらのテスト ケースでも失敗は発生しません。
すぐに、これらのテストをパイプラインで実行します。 JMeter によって書き込まれるファイル Results.xml は、パイプラインのテスト結果には発行されない中間ファイルと考えることができます。 JUnit.xml が最終的なレポート ファイルです。 このファイルは、チームが結果を視覚化できるように、パイプラインに発行されます。