Gatling-基於Scala,Akka&Netty的效能測試框架
Intro
Gatling是新一代的開源測試框架,基於Scala,Akka和Netty。具有三大特色:
- 高效能。
- 生成HTML測試報告。
- 可以使用指令碼錄製和對開發者友好的DSL編寫測試指令碼。
最新版本為:2.1.7, 需要at least JDK7u6。
使用方式:
- 直接執行:下載官方bundle包,進入
bin
目錄中執行指令碼gatling.sh
(Unix like) orgatling.bat
(windows)。 - 使用Extensions(Maven, SBT, Jenkins等)。
檔案目錄:
http://gatling.io/docs/2.1.7/general/bundle_structure.html
├── bin
│ gatling.bat
│ gatling.sh
│ recorder.bat
│ recorder.sh
├── conf
├── lib
│ └── zinc
├── results
├── target
│ └── test-classes
│ └── computerdatabase
└── user-files
├── bodies
├── data
└── simulations
└── computerdatabase
bin/
:目錄中的gatling.sh
gatling.bat
為執行測試指令碼;recorder.sh
or recorder.bat
是一個圖形化的指令碼錄製工具。 user-files/simulations
:使用者的測試指令碼檔案儲存在該目錄中;該目錄中已經存在一個Gatling測試指令碼樣例,我們可以根據該樣例開始Gatling測試指令碼的編寫。 user-files/data
:測試需要的資料(i.e. 使用者名稱,密碼等)。 results/
:生成的HTML測試報告會存放在該目錄下。
直接執行測試指令碼
SBT plugin
Setup
在
project/plugins.sbt
中新增plugin:
addSbtPlugin("io.gatling" % "gatling-sbt" % "2.1.7")
在build.sbt中新增依賴:
libraryDependencies ++= Seq(
"io.gatling.highcharts" % "gatling-charts-highcharts" % "2.1.7" % "test",
"io.gatling" % "gatling-test-framework" % "2.1.7" % "test")在
build.sbt
新增enablePlugins(GatlingPlugin)
Usage
進入sbt
$ cd gatling-template
$ sbt
- Run all simulations:
> test
- Run a single simulation:
> testOnly computerdatabase.BasicSimulation
- List all tasks:
> tasks
- Start recorder:
> startRecorder
生成報告目錄:target/gatling
‘Test’ vs ‘Integration Tests’(it)
Gatling提供了兩套SBT自定義配置:Gatling
& GatlingIt
,分別在不同的目錄中。這種方式的意圖是可以針對不同情況的測試,選擇不同的測試配置。
Gatling
(單元測試):當我們的測試是低注入,只是測試方法的時候,就可以在src/test
-Gatling
配置的預設目錄下寫測試指令碼-它們一般是可以很快完成的單元測試。
simulations
預設目錄:src/test/scala
, 使用scalaSource in Gatling
設定。
reports
預設目錄:target/gatling
,使用target in Gatling
設定。GatlingIt
(整合測試):然而,很多測試都是高注入,複雜的整合測試。我們要在src/it
-GatlingIt
配置的預設目錄下寫測試指令碼-它們一般都是耗費資源和時間的整合測試。
simulations
預設目錄:src/it/scala
, 使用scalaSource in Gatling
設定。
reports
預設目錄:target/gatling-it
,使用target in Gatling
設定。Note:
當使用GatlingIt
時,sbt命令前要加字首it:
,e.g.> test
變成> it:test
過載JVM options
可以使用overrideDefaultJavaOptions
過載預設JVM options:
javaOptions in Gatling := overrideDefaultJavaOptions("-Xms1024m", "-Xmx2048m")
編寫測試指令碼
Gatling提供了幾個測試指令碼的樣本,我們介紹下一個簡單的指令碼。
package computerdatabase
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation {
val httpConf = http
.baseURL("http://computer-database.gatling.io") // 1
.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") // 2
.exec(http("request_1")
.get("/"))
.pause(5)
setUp( // 3
scn.inject(atOnceUsers(1))
).protocols(httpConf)
}
一般gatling指令碼主要由三部分組成:
- Define http protocol:
定義http的各項內容,設定測試的網址-baseURL;設定HTTP Header。 - new scenario物件:
建立scenario物件。exec
執行一個request
,get
方法,pause
暫停5s。 - 設定scenario:
使用setUp
裝載多個scenario,並設定同時多少個使用者併發訪問,以及訪問方式(在一個時間點內同時併發還是在一段時間內漸進併發)等。