SlideShare a Scribd company logo
はじめての Gatling
Naoya Nakazawa @n0ts
2016/02/16
目次
• Gatling とは
• Gatling のインストール方法
• Gatling レコーダー
• Gatling の使い方
• Gatling のレポート
• Gatling の実例 Tips
Gatling とは
• http://gatling.io
• Scala ベースの高負荷テストフレームワーク
• ab や wrk のようなベンチマークに近いが、Scala でロ
ジックを記述することができる
• ab (Apache Bench):
• https://httpd.apache.org/docs/2.4/programs/
ab.html
• wrk:
• https://github.com/wg/wrk
特長
• HTML レポートで出力することができる
• HTTP GET 以外にも POST にも対応している
• リファラー、クッキーの付与はデフォルトで対応してい
る!
• Scala 力が低くても以外と簡単に設定を書くことが出来
る(自験!)
インストール
1. JDK7u6 以降が必要なので、インストール
2. 公式ホームページから zip ファイルをダウンロード
http://gatling.io/#/download
3. Linux / OS X なら bin/gatling.sh あるいは、Windows
なら bin/gatling.bat で実行するだけ
レコーダー
• Gatling のテストシナリオを自動的に生成するツール
• bin/recorder.sh で実行する
• レコーダーで開始すると、プロキシ経由のリクエスト
が自動的に Gatling のシミュレーションファイルとし
て保存される
レコーダー画面
レコーダーで生成されるシナリオの例
package computerdatabase // パッケージ名
import io.gatling.core.Predef._ // 必要なインポートたち
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation { // クラス定義、Simulation を敬称しないといけない
val httpConf = http // HTTP リクエストの共通設定
.baseURL("http://computer-database.gatling.io") // リクエスト対象の URL
.acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // 共通の HTTP ヘッダー
.doNotTrackHeader("1") // DNT ヘッダーの送信
.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") // HTTP リクエスト名、"request_1" は最終レポートに表示される
.get("/")) // URI / へ GET リクエストする
.pause(5) // 一時スリープタイム
setUp( // このシミュレーションで実行するシナリオのセットアップ
scn.inject(atOnceUsers(1)) // scn という名前で 1 シングルユーザでリクエストする
).protocols(httpConf) // 最初の HTTP リクエストの共通設定を付与する
}
実行例
$	bin/gatling.sh

GATLING_HOME	is	set	to	$GATLING_ROOT

Choose	a	simulation	number:

					[0]	test.BasicSimulation

					[1]	test.FooSimulation

※番号を入力	1

...

----	Global	Information	--------------------------------------------------------

>	request	count																																							10	(OK=10					KO=0					)

>	min	response	time																																				5	(OK=5						KO=-					)

>	max	response	time																																			58	(OK=58					KO=-					)

>	mean	response	time																																		16	(OK=16					KO=-					)

>	std	deviation																																							14	(OK=14					KO=-					)

>	response	time	50th	percentile																							12	(OK=12					KO=-					)

>	response	time	75th	percentile																							17	(OK=17					KO=-					)

>	mean	requests/sec																																5.141	(OK=5.141		KO=-					)	*1

----	Response	Time	Distribution	------------------------------------------------

>	t	<	800	ms																																										10	(100%)

>	800	ms	<	t	<	1200	ms																																	0	(		0%)

>	t	>	1200	ms																																										0	(		0%)

>	failed																																															0	(		0%)

================================================================================

Reports	generated	in	0s.

Please	open	the	following	file:	results/scenariosimulation-xxx/index.html

*1: 秒間あたりの処理したりクエスト数、KO は NG という意味
実行結果
• あわせて results 以下に HTML ファイルとして出力され
る
http://gatling.io/docs/2.1.1/general/reports.html
Gatling の実例
同じリクエストを繰り返す
• 5 回連続で繰り返す
val scn = scenario("RepeatBenchmark")
.repeat(5, "n") {
exec(http("top").get("/"))
}
ある条件のときのみリクエストをする
• scenarioProperty が pv のときリクエストをする
val scenarioProperty = System.getProperty("scenario",
"").toString

val scn = scenario("DoIfBenchmark")
.doIf(scenarioProperty, "pv") {
exec(http("pv").get("/pv"))
}
ある割合ごとにリクエストをする
• / を 50%、/foo を 20%、/bar を 30% ずつリクエスト
する
val scn = scenario("RandomBenchmark")

.randomSwitch(
50.0 -> exec(http("top").get("/")),
20.0 -> exec(http("foo").get("/foo")),
30.0 -> exec(http("bar").get("/bar"))
)
リクエストに動的にクッキーを付与する
• / のクッキー uid を /cookie へ付与する
val scn = scenario("CookieBenchmark")

.exec(http("top")
.get("/")
.check(headerRegex("Set-Cookie", "uid=(.*);
Expires=.*; Domain=.*; Path=.*").saveAs("uid")))
.exec(addCookie(Cookie("uid", "${uid}")))
.exec(http("cookie").get("/"))
リクエストに動的にクッキーを付与する
• /baz へのリクエストは "bar UA" にする
val userAgent = Map("User-Agent" -> "bar UA")
val scn = scenario("UABenchmark")

.exec(http("baz")
.get("/baz")
.headers(userAgent)
)
ステータスコード 303 はステータス OK とする
• /redirect は 303 を返して、リダイレクトはしない
val scn = scenario("RedirectBenchmark")

.exec(http("top")
.get("/redirect")
.disableFollowRedirect
.check(status.is(303))
)
この他は公式ドキュメントをどうぞ

http://gatling.io/docs/2.0.0-RC5/general/
index.html
Enjoy!!!

More Related Content

はじめての Gatling