Scala製の負荷試験ツールであるGatlingの日本語の記事は結構あるのですが、公式ツールを使用したものばかりでした。コードから実行してみましたので、やり方とちょっとした解説など書いてみます。

Gatlingそのものについてと公式ツールを使用したやり方は様々な記事があるのでそちらにお任せします。

環境


  • sbt 1.1.1
  • gatling-sbt 2.2.2 (Gatlingの公式sbtプラグインです)
  • Scala 2.12.4

でやってます。ぶっちゃけるとsbtプラグインを使用した公式のデモプロジェクトが存在するので、それを参考にして書けばいいのですが、せっかくやったので解説付きで書きます。

プロジェクトのディレクトリ構成


こういう構成でやります。

1
2
3
4
5
6
7
8
9
10
11
12
13
.
├── build.sbt
├── project
│   ├── build.properties
│   └── plugins.sbt
└── src
   └── test
├── resources
│   └── gatling.conf
└── scala
└── net
└── yoshinorin
└── BasicSimulation.scala

scala以下に/net/yoshinorinというディレクトリがあります。このディレクトリ配下にテストコードを格納していますが、これはJavaのパッケージ命名規則とやらにのっとってやっているだけで、パッケージを公開しない場合とかはscala直下にテストコードを格納すればよいはずです。

※ Javaは詳しくないですが調べた限りは公開しないのであればいらないハズです。

プラグインの宣言


plugin.sbtを作成して下記を記述します。バージョンは使用するものに合わせて適宜変えて下さい。

1
addSbtPlugin("io.gatling" % "gatling-sbt" % "2.2.2")

ビルドの定義


build.sbtにビルド定義を記述します。ここも使用するバージョンに合わせて適宜変えて下さい。

1
2
3
4
5
6
7
8
9
10
name := "gatling-sample"
version := "0.1"
scalaVersion := "2.12.4"

libraryDependencies ++= Seq(
"io.gatling" % "gatling-test-framework" % "2.3.0" % "test",
"io.gatling.highcharts" % "gatling-charts-highcharts" % "2.3.0" % "test"
)

enablePlugins(GatlingPlugin)

この辺を見る限りだとgatling-test-frameworkはGatlingを実行するためのライブラリっぽいですね。gatling-charts-highchartsHighChartsというJavaScript制のチャートライブラリをベースにしたGatling向けのライブラリのようです。結果のレポート表示用だと思います。

テストコード書く


src/test/scalaディレクトリ以下にテストコードを書きます。以下は公式サンプルのURLを変えただけのものです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package net.yoshinorin

import io.gatling.core.Predef._
import io.gatling.http.Predef._

class BasicSimulation extends Simulation {

val httpConf = http
.baseURL("http://localhost:9000")
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
.doNotTrackHeader("1")
.acceptLanguageHeader("en-US,en;q=0.5")
.acceptEncodingHeader("gzip, deflate")
.userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0")

val scn = scenario("BasicSimulation")
.exec(http("request_1")
.get("/"))
.pause(5)

setUp(
scn.inject(atOnceUsers(1))
).protocols(httpConf)
}

前述のとおり、Javaのパッケージ命名規則にのっとって私の保有しているドメインで記述していますが、ここは公開しないのであれば適当な名前でよいはずです。公式サンプルだとcomputerdatabaseとかになってます。

今回はサンプルなので1テストしか書いていませんが、テストが複数ある場合はテストごとにクラスを作成していきます。この記事の最後に書いていますが、ここのテストの作成は公式ツールを使用してブラウザ操作で生成するのが楽なのではないかと思いました。

設定ファイル


別に作成しなくてもデフォルト設定で動くようです。変更したい場合はsrc/test/resources配下にgatling.confというファイル名で作成します。設定ファイルは公式のデモサンプルを見ればよいです。

実行する


sbtコマンドでsbtを起動します。後はatling:testで全テストが実行されます。特定のテストのみ実行したい場合はtestOnlyタスクを実行します。例えば前述のコードのテストのみ実行したい場合は下記のとおりです。

1
gatling:testOnly net.yoshinorin.BasicSimulation

テストレポート


実行結果のレポートはtarget/gatlingディレクトリ内に作成されます。

まとめ


公式ツールを使用すればブラウザ操作でテストコードが生成できるので、基礎となるコードの生成はツールで行って、それを修正したものを今回のsbtタスクから実行するのが楽なんじゃないかと思いました。