JMeter DSL

こんにちは、平田です。

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形式のレポートを出しています。

HTML形式のレポート

JMeter自体の知識が結局は必要なのですが、プログラマにとってはJMeterのGUIを駆使するよりも楽だと思います。

コメントを残す

メールアドレスが公開されることはありません。