Gatling的進階一

weixin_34248118發表於2016-11-14

轉載:http://www.51testing.com/html/10/26810-852966.html

首先 抄襲一個Gatling的介紹

Gatling是一款基於Scala 開發的高效能伺服器效能測試工具,它主要用於對伺服器進行負載等測試,並分析和測量伺服器的各種效能指標。Gatling主要用於測量基於HTTP的伺服器,比如Web應用程式,RESTful服務等,除此之外它擁有以下特點:
  • 支援Akka Actors 和 Async IO,從而能達到很高的效能
  • 支援實時生成Html動態輕量報表,從而使報表更易閱讀和進行資料分析
  • 支援DSL指令碼,從而使測試指令碼更易開發與維護
  • 支援錄製並生成測試指令碼,從而可以方便的生成測試指令碼
  • 支援匯入HAR(Http Archive)並生成測試指令碼
  • 支援Maven,Eclipse,IntelliJ等,以便於開發
  • 支援Jenkins,以便於進行持續整合
  • 支援外掛,從而可以擴充套件其功能,比如可以擴充套件對其他協議的支援
  • 開源免費

Gatling適用的場景包括:測試需求經常改變,測試指令碼需要經常維護;測試環境的客戶機效能不強,但又希望發揮硬體的極限效能;能對測試指令碼進行很好的版本管理,並通過CI進行持續的效能測試;希望測試結果輕量易讀等。

是thoughtworks的工程師對其的描述,懶的自己寫了。

跑起來之後,就需要研究一下到底怎麼寫和怎麼錄製了。

第一,gatling使用的是Scala語言,網站說學起來不難,給出的學習地址是http://twitter.github.io/scala_school/

國內的教學網站http://www.scalachina.com/

不過我自己習慣了直接跳過往後看,先知道所以然,然後再去知道然

直接拿示例看:

package foo.bar (1)
import com.excilys.ebi.gatling.core.Predef._ (2)
import com.excilys.ebi.gatling.http.Predef._
import com.excilys.ebi.gatling.jdbc.Predef._
import Headers._
import akka.util.duration._
import bootstrap._
import assertions._

class SimulationWithFollowRedirect extends Simulation { (3)
//你的程式碼從這裡開始
  val scn = scenario("我的場景")
        .exec(http("我的頁面")             
        .get("http://mywebsite.com/page.html")) (4)

   setUp(scn.users(10)) (5)
// 程式碼結束
}

1. 包的寫法沒啥特殊
2. 這個是唯一必須的引入,要不然,啥也跑不起來
3. 所有的類都是整合了Simulation這個類,類的定義很標準化
4. val是保留關鍵字,用來定義你的測試場景, 類似 def的用法
5. 從這裡開始就是你自定義的場景列表了

教程說,所有的demo基於http://excilysbank.gatling.cloudbees.net,可惜我連不上。有條件的自己下載,部署一個:https://github.com/excilys/excilys-bank

然後使用Recoder就可以進行場景錄製了,然後得到用於回放的scala檔案,如何使用Recorder,請參考另外一篇文章

我們拿自帶的 BasicExampleSimulation.scala 作為示例

我們可以看到,該檔案主要包含了如下幾個部分

1. HTTP protocol configuration 
最重要的是定義了使用那個地址作為base URL,並且作為一個Scala value定義好以後,可以在simulation中直接呼叫,語法是:
val httpProtocol = http
      .baseURL("http://excilys-bank-web.cloudfoundry.com")

2. Headers 定義
Header是作為一個Scala Map來定義的。在這裡,你可以定義每個request(請求)在傳送給server時使用的header。 這這裡預先定義之後,就可以在scenario中使用。雖然看起來把common的header定義出來沒什麼意思,實際上,這也是變相新增測試壓力和模擬真實使用者操作的必要方法。語法是:val headers_1 = Map(....)

3. scenario (場景)定義
在simulation之前需要定義好執行的場景,因為:在同一個simulation中可以同時包含多個scenario。作為一個Scala value, 語法是:val scn = scenario("場景的名字") ...

scenario主要的結構就是由exec和pause組成。exec用於描述要執行什麼操作,pause用例模擬使用者的思考時間

val scn = scenario("Login action")
  .group("Login"){
     exec(
         http("request_3")    
           .post("/login")
           .headers(headers_3)
           .param("username", "user1")
           .param("password", "password1")
           )
     .pause(1 milliseconds, 100 milliseconds)
     .exec( ...)
     .pause(...)
     }
     ... ...

上面的示例可以看到,exec要執行的操作是一個http,該http操作的名字是request_3,基於base URL採用了post方式發出請求,並附帶了兩個引數param。其中的header就是在headers裡預先定義好的headers_3。然後執行了一個pause的操作來模擬使用者的think time

如果exec太長,或者你想結構化一下程式碼,可以用這種方法:
val chain_1 = exec(...)...
val chain_2 = exec(...)...
val scn = scenario("My Scenario")
      .exec(chain_1)
      .exec(chain_2)

4. simulation (模擬操作)定義

simulation中的操作是通過setUp來定義的,users標明實際併發的使用者數

setUp(scn.inject(ramp(3 users) over (10 seconds)))
   .protocols(httpProtocol)
   .assertions(
     global.successfulRequests.percent.is(100), details("Login" /"request_3").responseTime.max.lessThan(2000))

通過assertion來進行斷言,scn來標識執行的場景, httpProtocal來標識HTTP protocol配置

ramp (users) over (times)是指在多長時間內觸發多少個指定使用者
注意 
ramp(3 users) over (10 seconds) 等同於scn.users(3).ramp(10)

相關文章