2015-05-12 109 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; 
    } 
} 

的问题,然后让你想出来的模拟信息有后已经运行。