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 } }
#新信貸通用接口 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要求的報頭) java
//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的變量中 json
場景的基本機構有兩種session
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 |
開放的負載: 封閉系統,您能夠控制併發的使用數量 封閉系統是併發用戶數量有上限的系統。在滿負荷運行時,新用戶只能在另外一個用戶退出時纔能有效地進入系統 封閉的負載: 開放系統,您能夠控制用戶的到達率 相反,開放系統沒法控制併發用戶的數量:即便應用程序沒法爲用戶提供服務,用戶也會不斷地到達。大多數網站都是這樣的
對於測試中的數據構造 每每是咱們比較痛苦的地方 雖然Gatling中提供了參數生成 可是並不能知足咱們的測試需求 ,憑藉以前對其餘工具的理解 同時Gatling
也是運行在java虛擬機中這兩點 我嘗試了將本身的java工具類放到Gatling中調用 從而進行參數的構造。併發
一、在Gatling 工程中的resource 目錄下建立一個lib 目錄
二、將本身生成的工具類jar包放到lib目錄下
三、將jar包載入System Library庫中
四、引入工具類
五、測試工具類 方法調用
這裏要注意的是Feeder這個函數,在加載參數的時候或者經過我這種方法,函數調用的外部jar包 都只會生效一次。所以要想靈活運用外部jar包工具類還須要在工程中再次加工,例如:我會調用jar包工具類一次性生成3000個數據,app
而後在調用封裝的方法便可。dom
一、須要注意的是feed在整個請求過程當中只加載一次傳遞參數的文件 也就是誰全部的傳遞的參數須要提早構造好 而後一次性加載到場景中 二、建立一個構造數據的腳本 實現兩個功能: 隨機生成的參數保存到本地 留做備用定位問題使用 隨機生成的參數傳遞到Array中