1.はじめに
仕事に適したツールを選択するのは困難です。このチュートリアルでは、Apache JMeter、Gatling、The Grinderの3つのWebアプリケーション負荷テストツールを単純なREST APIと比較して、これを簡単にします。
2.負荷テストツール
まず、それぞれの背景について簡単に見てみましょう。
2.1. ガトリング
Gatling はScalaでテストスクリプトを作成する負荷テストツールです。 ** GatlingのレコーダーはScatテストスクリプトを生成します。これはGatlingの重要な機能です。
2.2. Jメーター
JMeter はApacheによる負荷テストツールです。それは私達が構成のためにcanを使用する素晴らしいGUIを提供します。ロジックコントローラと呼ばれる独自の機能により、GUIでテストを柔軟に設定できます。
スクリーンショットや詳細な説明については、https://www.baeldung.com/jmeter[JMeterの紹介]チュートリアルをご覧ください。
2.3. グラインダー
そして私たちの最後のツール、http://grinder.sourceforge.net[The Grinder]は他の二つよりもプログラミングベースのスクリプトエンジンを提供し、Jythonを使います。ただし、The Grinder 3にはスクリプトを記録するための機能があります。
グラインダーはまたコンソールおよびエージェントプロセスを可能にするという点で他の2つのツールと異なります。この機能は、負荷テストが複数のサーバーにわたってスケールアップできるように、エージェントプロセスの機能を提供します。 開発者がデッドロックやスローダウンを見つけるために構築された負荷テストツールとして特に宣伝されています。
3.テストケースの設定
次に、テストのためにAPIが必要です。当社のAPI機能は次のとおりです。
-
報酬レコードを追加/更新する
-
1つまたはすべての報酬記録を見る
-
取引を顧客報酬記録にリンクする
-
顧客報酬レコードの取引を表示
-
私たちのシナリオ:**
ある店舗が、貯蓄を得るために顧客への報酬アカウントを必要とする新規顧客および返品顧客とともに全国規模の販売を行っています。リワードAPIは、顧客IDで顧客リワードアカウントをチェックします __. __リワードアカウントが存在しない場合は追加してから、トランザクションにリンクします。
その後、トランザクションを照会します。
3.1. 私たちのREST API
いくつかのメソッドスタブを見て、APIを簡単にハイライトしましょう。
@PostMapping(path="/rewards/add")
public @ResponseBody RewardsAccount addRewardsAcount(@RequestBody RewardsAccount body)
@GetMapping(path="/rewards/find/{customerId}")
public @ResponseBody Optional<RewardsAccount> findCustomer(@PathVariable Integer customerId)
@PostMapping(path="/transactions/add")
public @ResponseBody Transaction addTransaction(@RequestBody Transaction transaction)
@GetMapping(path="/transactions/findAll/{rewardId}")
public @ResponseBody Iterable<Transaction> findTransactions(@PathVariable Integer rewardId)
報酬IDによる取引の照会や顧客IDによる報酬アカウントの取得など、関係の一部に注意してください。これらの関係は私達のテストシナリオ作成のために論理と応答解析を強制します。
幸いなことに、私たちのツールはすべてそれをかなりうまく処理します。
3.2. 私達のテスト計画
次に、テストスクリプトが必要です。
公平に比較するために、各ツールについて同じ自動化手順を実行します。
-
ランダムな顧客アカウントIDを生成する
-
取引を投稿する
-
ランダムな顧客IDとトランザクションIDの応答を解析します
-
顧客IDで顧客報酬アカウントIDを照会します.
-
報酬アカウントIDの応答を解析します
-
リワードアカウントIDが存在しない場合は、投稿でアカウントIDを追加します
-
を使用して更新された報酬IDで同じ初期取引を転記
トランザクションID 。報酬アカウントIDによるすべての取引の照会
各ツールのステップ4を詳しく見てみましょう。そして、必ずhttps://github.com/eugenp/tutorials/tree/master/testing-modules/load-testing-comparison/src/main/resources/scripts[3つすべての完成したスクリプトのサンプル]をチェックしてください。
3.3. ガトリング
Gatlingにとっては、Gatling APIは堅牢で多くの機能が含まれているので、Scalaに精通していることは開発者にとって有益なことです。
GatlingのAPIは、ステップ4でわかるように、ビルダーDSLアプローチを取ります。
.exec(http("get__reward")
.get("/rewards/find/${custId}")
.check(jsonPath("$.id").saveAs("rwdId")))
.pause(1)
特に注目に値するのは、HTTP応答を読んで検証する必要があるときのGatlingのJSON Pathのサポートです。ここでは、報酬IDを取得してGatlingの内部状態に保存します。 1秒の一時停止に注意してください。この必要なチェックは次の依存要求が失敗するのを防ぎます。 check 呼び出しと saveAs は、後続の exec 要求をブロックしませんでした。
また、Gatlingの式言語は動的なリクエストボディをより簡単にします
.body(StringBody(
"""{
"customerRewardsId":"${rwdId}",
"customerId":"${custId}",
"transactionDate":"${txtDate}"
}""")).asJson)
この比較のための最後の設定です。 __atOnceUsers __methodは、スレッド/ユーザーを設定します。
val scn = scenario("RewardsScenario")
.repeat(10) {
...
}
setUp(
scn.inject(atOnceUsers(100))
).protocols(httpProtocol)
-
Scalaスクリプト全体 は、Githubリポジトリで表示できます。
3.4. Jメーター
-
JMeterは、GUI設定後にXMLファイルを生成します** ファイルには、setプロパティとその値を持つJMeter固有のオブジェクトが含まれています。
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Add Transaction" enabled="true">
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="Transaction Id Extractor" enabled="true">
testname 属性を調べてください。これらは上記の論理的なステップと一致しているので、ラベルを付けることができます。スクリプトを実行するときに、子、変数、および依存関係ステップを追加する機能により、JMeterに柔軟性が与えられます。さらに、変数のスコープも設定します。
JMeterのランとユーザーのための設定は ThreadGroups と LoopController を使います:
<stringProp name="LoopController.loops">10</stringProp>
<stringProp name="ThreadGroup.num__threads">100</stringProp>
jmx ファイル全体を参照として表示 可能ではありますが、 .jmx ファイルとしてXMLでテストを書くことは、フル機能のGUIでは意味がありません。
3.5. グラインダー
ScalaとGUIの関数型プログラミングがなければ、The Grinder用のJythonスクリプトはかなり基本的に見えます。いくつかのシステムJavaクラスを追加すれば、コードの行数がずっと少なくなります。
customerId = str(random.nextInt());
result = request1.POST("http://localhost:8080/transactions/add",
"{"'"customerRewardsId"'":null,"'"customerId"'":"+ customerId + ","'"transactionDate"'":null}")
txnId = parseJsonString(result.getText(), "id")
ただし、JSON文字列の解析など、文字列保守コードを増やす必要があることと、テストセットアップコードの行数が少なくなることとのバランスが取れています。また、http://grinder.sourceforge.net/g3/script-javadoc/net/grinder/plugin/http/HTTPRequest.html[HTTPRequest]APIは機能がスリムです。
The Grinderでは、外部のプロパティファイルにスレッド、プロセス、実行の値を定義します。
grinder.threads = 100
grinder.processes = 1
grinder.runs = 10
-
The Grinder用の完全なJythonスクリプトはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/load-testing-comparison/src/main/resources/scripts[this].** のようになります。
4.テスト実行
4.1. テスト実行
3つのツールはすべて、大規模な負荷テストにコマンドラインを使用することをお勧めします。
Gatlingでは、 JAVA HOME と GATLING HOME が設定されていることだけが必要です。
Gatlingを実行するために使用します。
GATLING__HOME\bin\gatling.bat
JMeterは設定のためにGUIを起動するときにプロンプトが表示されるのでテストのためにGUIを無効にするためのパラメータを必要とします。
jmeter-n.cmd -t -l TestPlan.jmx -e -o[path to output folder]----
Gatlingと同様に、The Grinderでは__JAVA__HOME__と__GRINDERPATH__を設定する必要があります。しかし、それはまた、さらにいくつかのプロパティが必要です。
[source,powershell,gutter:,true]
set GRINDERPROPERTIES="%GRINDERPATH%\grinder.properties" set CLASSPATH="%GRINDERPATH%\lib\grinder.jar";%CLASSPATH%
上記のように、スレッド、実行、プロセス、コンソールホストなどの追加設定用に__grinder.properties__ファイルを用意しています。 最後に、コンソールとエージェントを次のようにブートストラップします。 [source,powershell,gutter:,true]
java -classpath %CLASSPATH% net.grinder.Console
[source,powershell,gutter:,true]
java -classpath %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%
==== 4.2. 試験結果 各テストは100ユーザー/スレッドで10回実行されました。ハイライトをいくつか展開しましょう。 [cols=",^,^,^,^,^",] | =================================================== ===================== | | | ** 成功した要求** | ** エラー** | ** 合計テスト時間** | ** 平均応答時間(ミリ秒)** | ** ピークスループット** | ** ガトリング** | 4100要求| 100(ソフト)** | 31 | 64.5 | 132 req/s | ** JMeter ** | 4135リクエスト| 0 | 35 | 81 | 1080要求数/秒 | ** The Grinder ** | 5000リクエスト| 0 | 5.57 | 65.72 | 1284 req/s | ================================== ============================================ 一目でわかるように、The Grinderは他の2つのツールよりも6倍高速です。他の2人は同様に〜30秒で計時した。 The GrinderとGatlingの間の同じステップでは、100個のスレッドが作成され、それぞれ1544msと16msかかりました。 The Grinderは高速ですが、開発時間が長くなり、出力データの多様性が低くなります。 追加の注意Gatlingには100の「ソフト」な失敗があります。これは、存在しない報酬IDのロジックチェックのためです。他のツールはif条件付き失敗をエラーとしてカウントしません。この制限はGatling APIにも含まれています。 [[test-summary]] === 5.まとめ 今度は、それぞれの負荷テストツールを全体的に見てみましょう。 [cols="^,^,^,^",] | ================================= | | | ** Gatling ** | ** JMeter ** | ** The Grinder ** |プロジェクトとコミュニティ| 9 | 9 | 6 |パフォーマンス| 7 | 7 | 10 |スクリプト能力/API | 7 | 9 | 8 | UI | 8 | 8 | 5 |レポート| 9 | 7 | 6 |統合| 7 | 9 | 7 | ** まとめ** | ** 7.8 ** | ** 8.2 ** | ** 7 ** | =================== ================== ** ガトリング:** ** 美しいレポートを出力する、頑丈で洗練された負荷テストツール Scalaスクリプト ** 製品のオープンソースとエンタープライズのサポートレベル ** Jメーター:** コーディング不要のテストスクリプト開発用の堅牢なAPI 必須 ** Apache FoundationのサポートとMavenとの優れた統合 ** グラインダー:** Jythonを使用する開発者向けの高速パフォーマンス負荷テストツール ** クロスサーバーのスケーラビリティにより、大規模なテストにさらなる可能性を提供 簡単に言えば、スピードとスケーラビリティが必要な場合は、The Grinderを使用してください。 見栄えの良いインタラクティブなグラフが変化を主張するためのパフォーマンスの向上を示すのに役立つ場合は、Gatlingを使用してください。 JMeterは複雑なビジネスロジックや多くのメッセージタイプを持つ統合層のためのツールです。 Apache Software Foundationの一環として、JMeterは成熟した製品と大規模なコミュニティを提供します。 === 6.まとめ 結論として、私たちはツールが他の分野で輝いている間、ある分野で同等の機能を持っていることがわかります。適切な仕事に適したツールは、ソフトウェア開発に役立つ口語的な知恵です。 最後に、APIとスクリプトはhttps://github.com/eugenp/tutorials/tree/master/testing-modules/load-testing-comparison[Github]にあります。