Gatling的進階一

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

首先 抄襲一個Gatling的介紹git

Gatling是一款基於Scala 開發的高性能服務器 性能測試 工具,它主要用於對服務器進行負載等測試,並分析和測量服務器的各類性能指標。Gatling主要用於測量基於HTTP的服務器,好比 Web 應用程序,RESTful服務等,除此以外它擁有如下特色:
  • 支持Akka Actors 和 Async IO,從而能達到很高的性能
  • 支持實時生成Html動態輕量報表,從而使報表更易閱讀和進行數據分析
  • 支持DSL腳本,從而使測試腳本更易開發與維護
  • 支持錄製並生成測試腳本,從而能夠方便的生成測試腳本
  • 支持導入HAR(Http Archive)並生成測試腳本
  • 支持Maven,Eclipse,IntelliJ等,以便於開發
  • 支持Jenkins,以便於進行持續集成
  • 支持插件,從而能夠擴展其功能,好比能夠擴展對其餘協議的支持
  • 開源免費

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

是thoughtworks的工程師對其的描述,懶的本身寫了。web

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

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

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

不過我本身習慣了直接跳過日後看,先知道因此然,而後再去知道然less

直接拿示例看:工具

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)post

   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)

相關文章
相關標籤/搜索