1. 程式人生 > >Gatling-基於Scala,Akka&Netty的效能測試框架

Gatling-基於Scala,Akka&Netty的效能測試框架

Intro

Gatling是新一代的開源測試框架,基於Scala,Akka和Netty。具有三大特色:

  1. 高效能。
  2. 生成HTML測試報告。
  3. 可以使用指令碼錄製和對開發者友好的DSL編寫測試指令碼。

最新版本為:2.1.7, 需要at least JDK7u6。

使用方式

  1. 直接執行:下載官方bundle包,進入bin目錄中執行指令碼gatling.sh(Unix like) or gatling.bat(windows)。
  2. 使用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

or gatling.bat為執行測試指令碼;recorder.sh or recorder.bat是一個圖形化的指令碼錄製工具。
user-files/simulations:使用者的測試指令碼檔案儲存在該目錄中;該目錄中已經存在一個Gatling測試指令碼樣例,我們可以根據該樣例開始Gatling測試指令碼的編寫。
user-files/data:測試需要的資料(i.e. 使用者名稱,密碼等)。
results/:生成的HTML測試報告會存放在該目錄下。

直接執行測試指令碼

SBT plugin

Setup

  1. project/plugins.sbt中新增plugin:
    addSbtPlugin("io.gatling" % "gatling-sbt" % "2.1.7")

  2. 在build.sbt中新增依賴:
    libraryDependencies ++= Seq(
    "io.gatling.highcharts" % "gatling-charts-highcharts" % "2.1.7" % "test",
    "io.gatling" % "gatling-test-framework" % "2.1.7" % "test")

  3. 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指令碼主要由三部分組成:

  1. Define http protocol:
    定義http的各項內容,設定測試的網址-baseURL;設定HTTP Header。
  2. new scenario物件:
    建立scenario物件。exec執行一個requestget方法,pause暫停5s。
  3. 設定scenario:
    使用setUp裝載多個scenario,並設定同時多少個使用者併發訪問,以及訪問方式(在一個時間點內同時併發還是在一段時間內漸進併發)等。