腳本示例:
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BaiduSimulation extends Simulation {
//讀取配置文件
val conf = ConfigFactory.load()
//實例化請求方法
val httpProtocol = http.baseUrl(conf.getString("baseUrl"))
//包裝請求接口
val rootEndPointUsers = scenario("信貸重構")
.exec(http("信貸重構-授信申請")
.post("/apply")
.header("Content-Type", "application/json")
.header("Accept-Encoding", "gzip")
.body(RawFileBody("computerdatabase/recordedsimulation/0001_request.json"))
.check(status.is(200)
.saveAs("myresponse") )
.check(bodyString.saveAs("Get_bodys")))
.exec{
session => println("這就是傳說的值傳遞"+session("Get_bodys").as[String] )
session
}
}
配置文件(application.properties):
#新信貸通用接口
baseUrl = http://172.16.3.179:7800
腳本編寫:
Gatling腳本的編寫主要包含三個步驟:
1. http head配置
2. Scenario 執行細節
3. setUp 組裝
編寫實例:
//配置文件地址src/galting/resource/application.properties
//使用的時候 初始化配置文件的讀
val conf = ConfigFactory.load()
報頭定義:
//設置請求的根路徑
val httpConf = http.baseURL(conf.getString("baseUrl"))
這里需要知道的是報頭也可以在seniario中定義(有下列兩種方式去設置Json和xml要求的報頭)
//http(...).get(...).asJSON等同於:
http(...).get(...)
.header(HttpHeaderNames.ContentType,HttpHeaderValues.ApplicationJson)
.header(HttpHeaderNames.accept,HttpHeaderValues.ApplicationJson)
//http(...).get(...).asXML等同於
http(...).get(...)
.header(HttpHeaderNames.ContentType,HttpHeaderValues.ApplicationXml)
.header(HttpHeaderNames.accept,HttpHeaderValues.ApplicationXml)
場景定義:
val rootEndPointUsers = scenario("信貸重構").exec(http("信貸重構-授信申請").post("/apply"))
場景的定義要有名稱,原因是同一個模擬器中可以 定義多個場景,場景通常被存儲在Scala的變量中
場景的基本機構有兩種
exec :用來描述行動,通常是發送到待測應用的一個請求
pause: 用來模擬連續請求的用戶思考時間
模擬器的定義:
//設置線程數
setUp(rootEndPointUsers.inject(atOnceUsers(10)).protocols(httpConf))
模擬器的參數:
setUp( rootEndPointUsers.inject(
nothingFor(4 seconds), // 1
atOnceUsers(10), // 2
rampUsers(10) over(5 seconds), // 3
constantUsersPerSec(20) during(15 seconds), // 4
constantUsersPerSec(20) during(15 seconds) randomized, // 5
rampUsersPerSec(10) to 20 during(10 minutes), // 6
rampUsersPerSec(10) to 20 during(10 minutes) randomized, // 7
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30), // 9
heavisideUsers(1000) over(20 seconds) // 10
).protocols(httpConf)
)
函數 | 解釋 |
nothingFor(4 seconds) | 等待一個指定的時間 |
atOnceUsers(10) | 一次性注入指定數量的用戶 |
ampUsers(10) over(5 seconds) | 在指定的時間內,以線性增長的方式注入指定數量的用戶 |
constantUsersPerSec(20) during(15 seconds) | 在指定的時間內,以固定頻率注入用戶,以每秒的多少用戶的方式。固定時間間隔 |
constantUsersPerSec(20) during(15 seconds) randomized | 在指定時間段內,用固定的頻率注入用戶,以每秒多少個用戶的方式定義。用戶以隨機間隔注 |
ampUsersPerSec(10) to 20 during(10 minutes) | 在指定時間段內,從起始頻率到目標頻率注入用戶,以每秒多少個用戶的方式定義。用戶以固定間隔注入 |
rampUsersPerSec(10) to 20 during(10 minutes) randomized | 在指定時間段內,從起始頻率到目標頻率注入用戶,以每秒多少個用戶的方式定義。用戶以隨機間隔注入 |
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds) | 在指定時間內,重復執行定義好的 注入步驟,間隔指定時間,直到達到最大用戶數nbUsers |
splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy atOnceUsers(30) | 在指定時間內,重復執行定義好的 第一個注入步驟,間隔定義好的 第二個注入步驟,直到達到最大用戶數nbUsers |
設置場景屬性的時候 需要注意以下兩點:
開放的負載:
封閉系統,您可以控制並發的使用數量
封閉系統是並發用戶數量有上限的系統。在滿負荷運行時,新用戶只能在另一個用戶退出時才能有效地進入系統
封閉的負載:
開放系統,您可以控制用戶的到達率
相反,開放系統無法控制並發用戶的數量:即使應用程序無法為用戶提供服務,用戶也會不斷地到達。大多數網站都是這樣的
重點注意:
如果您希望根據每秒請求數而不是並發用戶數進行推理,那么可以考慮使用constantUsersPerSec()來設置用戶的到達率,從而設置請求數,而不需要進行節流,因為在大多數情況下這是多余的
技巧篇:
對於測試中的數據構造 往往是我們比較痛苦的地方 雖然Gatling中提供了參數生成 但是並不能滿足我們的測試需求 ,憑借之前對其他工具的理解 同時Gatling
也是運行在java虛擬機中這兩點 我嘗試了將自己的java工具類放到Gatling中調用 從而進行參數的構造。
下面開始介紹我的做法:
1、在Gatling 工程中的resource 目錄下創建一個lib 目錄
2、將自己生成的工具類jar包放到lib目錄下
3、將jar包載入System Library庫中
4、引入工具類
5、測試工具類 方法調用
這里要注意的是Feeder這個函數,在加載參數的時候或者通過我這種方法,函數調用的外部jar包 都只會生效一次。因此要想靈活運用外部jar包工具類還需要在工程中再次加工,例如:我會調用jar包工具類一次性生成3000個數據,
然后在調用封裝的方法即可。
1、需要注意的是feed在整個請求過程中只加載一次傳遞參數的文件 也就是誰所有的傳遞的參數需要提前構造好 然后一次性加載到場景中 2、創建一個構造數據的腳本 實現兩個功能: 隨機生成的參數保存到本地 留作備用定位問題使用 隨機生成的參數傳遞到Array中