こんにちは、平田です。
JMeterの負荷テストをJavaで記述するJMeter DSLを試してみました。
JMeterは古くからある負荷テストツールで、GUIで負荷テストシナリオを定義し、作成した負荷テストの定義体を元に負荷テストを実行します。GUIでシナリオを作成する、いわゆるノーコード的なところが特徴です。
JMeter DSLは、JMeterの負荷テストの定義をJavaで記述するライブラリです。負荷テスト as code なツールはGatling等いくつかあるのですが、ノーコードなJMeterをわざわざコード化した理由については公式サイトに書かれています。
- GUIで定義するのが大変。シナリオの全体像も分かりづらい。
- バージョン管理(変更差分追跡、レビュー、マージなど)したい。
- GatlingはScalaがつらい。JMeterのようなプロトコルサポート、エコシステムもない。
Gatlingは最近Javaで書けるようになりましたが、プロトコルサポートやエコシステムについてはJMeterにアドバンテージがあります。
ローカルのWebサーバに対してHTTPを投げるテストを書いてみました(作ったもの)。JUnitテストケースとして実装していますが、JMeter DSL自体は単なるAPIなのでテストである必要はありません。
class HomeVisitorTest {
@Test void someoneVisitsHome() throws Exception {
var stats = testPlan(
threadGroup("someone").rampTo(100, Duration.ofSeconds(5)).holdIterating(10).children(
transaction("someone visits home and see a file",
httpSampler("http://localhost:8080/"),
uniformRandomTimer(1000, 1000),
httpSampler("http://localhost:8080/pom.xml")
)
),
htmlReporter(String.format("jmeter-report-%s", Instant.now().toString().replace(":", "-")))
).run();
assertThat(stats.overall().sampleTimePercentile99())
.isLessThan(Duration.ofSeconds(1));
}
}
DSLはJMeterの構成要素をそのまま反映しており、JMeterに関するナレッジが必要になります。JMeterの負荷テスト定義(Test Plan)の構成要素は、マニュアルの Elements of a Test Plan で整理されています。上のサンプルではHTML形式のレポートを出しています。
JMeter自体の知識が結局は必要なのですが、プログラマにとってはJMeterのGUIを駆使するよりも楽だと思います。