2015-05-12 3 views
2

Я хочу использовать что-то вроде JCM Cucumber для выполнения тестов производительности, написанных для Gatling.Программно выполнить тесты Gatling

В идеале функции Cucumber могли бы как-то построить сценарий динамически - возможно, повторно использовать предопределенные объекты цепи, подобные методу, описанному в «Расширенном учебнике», например.

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

Я смотрел на то, как плагин Maven выполняет сценарии, и я также видел упоминание об использовании признака App, но я не могу найти какую-либо документацию для позже, и мне кажется, что кто-то другой хотел бы сделать это раньше ...

Может ли кто-нибудь указать (Gatling noob) в сторону какой-либо документации или пример кода, как этого достичь?

EDIT 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, которые могут быть построены с помощью стиля Given/When/Then Cucumber. Есть ли лучший или уже существующий подход?

ответ

3

К сожалению, в настоящее время невозможно, чтобы Gatling запускал экземпляр Simulation.

Не то, что это технически невозможно, но вы только первый человек, который пытается это сделать. В настоящее время Gatling обычно отвечает за компиляцию и может передавать только имя загружаемого класса, а не сам экземпляр.

Возможно, вы можете начать с разметки io.gatling.app.Gatling и io.gatling.core.runner.Runner, а затем предоставить PR для поддержки этого нового поведения. Первая является главной точкой входа, а вторая - способной управлять и управлять имитацией.

+0

Спасибо, я видел это, но похоже, что он загружает статические сценарии Gatling, не передавая динамически сгенерированный сценарий - я что-то упускаю? – SilentICE

+0

Теперь я понял. Я отредактировал свой ответ. –

2

Я недавно столкнулся с подобной ситуацией и не хотел разворачивать gatling. И хотя это решило мою непосредственную проблему, оно лишь частично решает то, что вы пытаетесь сделать, но, надеюсь, кто-то еще найдет это полезным.

Существует альтернатива.Gatling написан на Java и Scala, поэтому вы можете напрямую вызвать Gatling.main и передать ему аргументы, необходимые для запуска Gatling Simulation. Проблема заключается в том, что основной явно вызывает 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; 
    } 
} 

Проблема затем получить доступ к информации, которую из симуляции после того, как он есть был запущен.

Смежные вопросы