如何在cucumber-jvm中运行一个功能文件作为初始化(即在所有其他功能文件之前)?

时间:2016-12-09 09:01:02

标签: cucumber cucumber-jvm cucumber-junit cucumber-java cucumber-serenity

我有一个黄瓜特征文件'A',用作设置环境(数据清理和初始化)。我希望在所有其他功能文件可以运行之前执行它。

就像http://zsoltfabok.com/blog/2012/09/cucumber-jvm-hooks/中的@before一样。但是,这不起作用,因为我的功能文件'A'包含数百个黄瓜步骤,并不像以下那样简单:

@Before
public void beforeScenario() {
    tomcat.start();
    tomcat.deploy("munger");
    browser = new FirefoxDriver();
}

相反,最好能够将“A”作为整体运行作为特征文件。

我已经四处寻找但没有找到答案。我很惊讶以前没有人有这种要求。

我发现最接近的是'背景'。但这意味着我只能有一个巨大的功能文件,其顶部是“A”的内容,而我的测试的其余部分位于同一个文件中。我真的不想这样做。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

默认情况下,Cucumber功能按顺序运行单线程:

  1. 按功能文件目录按字母顺序排列
  2. 按目录
  3. 中的要素文件名按字母顺序排列

    然后在特征文件中按顺序执行场景。

    所以在第一个目录(alhpabetically)中有一个初始化功能,其文件名首先(按字母顺序)在该目录中排序。

    话虽如此,要求在功能文件中执行订单通常是一种不好的做法。我们并行运行我们的功能文件,因此顺序毫无意义。对于Jenkins或TeamCity,您可以添加一个构建步骤来执行一个功能文件,然后执行第二个构建步骤来执行其余的功能文件。

答案 1 :(得分:0)

我还有一个项目,我们有一个功能文件,其中包含一个名为Scenario: Test data的非常长的场景,其中包含很多非常长的场景,如下所示:

Given the system knows about the following employees
|uuid|user-key|name|nickname|
|1|0101140000|Anna|annie|
... hundreds of lines like this follow ... 

我们认为这个较长的SystemKnows场景非常有价值,因此我们的测试人员,产品负责人和开发人员都可以了解系统中的数据基线。我们的域非常复杂,我们需要这个参考数据基线,以便每个人都能够理解测试。 (这些参考数据几乎成为众所周知的角色,并且是共享团队的比喻)

一开始,我们依赖于字母命名约定,首先运行AAA.feature。

后来,我们发现这个设置很脆弱,并决定使用以下技巧,灵感来自PageObject模式:

  • 使用单行Given(~'^I set test data for all feature files$')

  • 添加背景
  • 在步骤定义中,有一个工厂来创建测试数据,并在factore方法中确保它只创建一次,如testFactory.createTestData()

通过这种方式,您可以方便地将参考设置表示为场景,增强团队沟通,但您也可以获得稳定的测试设置。

希望这有用! 阿形