Gatling腳本編寫技巧篇(二)


腳本示例:
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中        

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM