轉載:http://www.51testing.com/html/10/26810-852966.html
首先 抄襲一個Gatling的介紹
- 支援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)