2015-05-12 178 views
2

我想使用類似Cucumber JVM的東西來驅動爲Gatling編寫的性能測試。理想情況下,黃瓜功能將以某種方式動態地構建場景 - 可能重複使用類似於「高級教程」中所述的方法的預定義鏈對象,例如,以編程方式執行Gatling測試

val scn = scenario("Scenario Name").exec(Search.search("foo"), Browse.browse, Edit.edit("foo", "bar") 

我已經看了如何Maven插件執行腳本,而且我也看到使用應用程序特徵的提及,但我找不到以後的任何文件和這讓我感到別人將之前想這樣做...

任何人都可以指向(一個加特林noob)在一些文檔或示例代碼的方向如何實現這一目標?

編輯20150515

所以解釋多一點:

我創建了旨在建立起來,我覺得一個序列的特徵,是由黃瓜步驟觸發ChainBuilders:

trait GatlingDsl extends ScalaDsl with EN { 

    private val gatlingActions = new ArrayBuffer[GatlingBehaviour] 

    def withGatling(action: GatlingBehaviour): Unit = { 
    gatlingActions += action 
    } 
} 

一個GatlingBehaviour看起來是這樣的:

object Google { 

    class Home extends GatlingBehaviour { 
    def execute: ChainBuilder = 
     exec(http("Google Home") 
     .get("/") 
    ) 
    } 

    class Search extends GatlingBehaviour {...} 

    class FindResult extends GatlingBehaviour {...} 
} 

而且StepDef類中:

class GoogleStepDefinitions extends GatlingDsl { 

    Given("""^the Google search page is displayed$""") {() => 
    println("Loading www.google.com") 
    withGatling(Home()) 
    } 

    When("""^I search for the term "(.*)"$""") { (searchTerm: String) => 
    println("Searching for '" + searchTerm + "'...") 
    withGatling(Search(searchTerm)) 
    } 

    Then("""^"(.*)" appears in the search results$""") { (expectedResult: String) => 
    println("Found " + expectedResult) 
    withGatling(FindResult(expectedResult)) 
    } 
} 

的想法是,然後我就可以通過類似執行行動的整個序列:

val scn = Scenario(cucumberScenario).exec(gatlingActions) 
setup(scn.inject(atOnceUsers(1)).protocols(httpConf)) 

,然後檢查報告或趕上如有異常測試失敗,例如響應時間過長。

看來,無論我如何使用'exec'方法,它都會嘗試在那裏立即執行它,然後不等待該場景。

另外我不知道這是否是最好的方法,我們想爲我們的Gatling測試構建一些可重用的塊,可以通過Cucumber的Given/When/Then樣式構建。有更好的還是現有的方法?

回答

3

不幸的是,讓Gatling直接啓動一個Simulation實例是不現實的。

這不是在技術上不可行,但你只是第一個嘗試這樣做的人。 目前,Gatling通常負責編譯,只能傳遞要加載的類的名稱,而不是實例本身。

你也許可以從分叉io.gatling.app.Gatlingio.gatling.core.runner.Runner開始,然後提供一個PR來支持這個新行爲。前者是主要的入口點,後者可以實例化並運行模擬。

+0

謝謝,我已經看到了,但它看起來像加載靜態Gatling腳本沒有通過動態生成的情景 - 我錯過了什麼? – SilentICE

+0

現在我明白了。我編輯了我的答案。 –

2

我最近碰到類似的情況,並不想分岔。雖然這解決了我眼前的問題,但它只能部分解決您正在嘗試做的事情,但希望其他人會發現這一點很有用。

還有一個選擇。Gatling是用Java和Scala編寫的,因此您可以直接調用Gatling.main並將它傳遞給運行所需的Gatling模擬所需的參數。問題是,主要顯式調用System.exit,因此您還必須使用自定義安全管理器來防止它實際退出。 你需要知道兩件事情:

  1. 類(與全包)要運行 例如模擬:com.package.your.Simulation1
  2. 在二進制編譯路徑。

運行模擬代碼:

protected void fire(String gatlingGun, String binaries){ 
    SecurityManager sm = System.getSecurityManager(); 
    System.setSecurityManager(new GatlingSecurityManager()); 
    String[] args = {"--simulation", gatlingGun, 
      "--results-folder", "gatling-results", 
      "--binaries-folder", binaries}; 
    try { 
     io.gatling.app.Gatling.main(args); 
    }catch(SecurityException se){ 
     LOG.debug("gatling test finished."); 
    } 
    System.setSecurityManager(sm); 
} 

簡單的安全管理器,我用:

public class GatlingSecurityManager extends SecurityManager { 
    @Override 
    public void checkExit(int status){ 
     throw new SecurityException("Tried to exit."); 
    } 
    @Override 
    public void checkPermission(Permission perm) { 
     return; 
    } 
} 

的問題,然後讓你想出來的模擬信息有後已經運行。