【问题标题】:How do I set the path to my Cucumber features using cucumber-junit?如何使用 cucumber-junit 设置 Cucumber 功能的路径?
【发布时间】:2020-05-21 06:23:01
【问题描述】:

我尝试使用 Java 和 Maven 构建我的第一个可执行规范。我用这种结构创建了一个简单的项目:

specification
|-src
  |-test
    |-java
      |-mypackage
        |-MyFeatureTest.java
    |-resources
      |-MyFeature.feature

在junit测试MyFeatureTest.java我有这个:

import org.junit.runner.RunWith;
import cucumber.junit.Cucumber;

@RunWith(Cucumber.class)
public class HomepageTest {
}

现在https://github.com/cucumber/cucumber-jvm/wiki/IDE-support 说我应该添加以下行:

@Cucumber.Options(paths={"my/super.feature:34"})

我尝试将其修改为

@Cucumber.Options(paths={"src/test/resources/"})

但是注释@Cucumber.Options 根本不可用。我的pom.xml 有这个依赖:

<dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>4.10</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>info.cukes</groupId>
  <artifactId>cucumber-java</artifactId>
  <version>1.0.0.RC20</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>info.cukes</groupId>
  <artifactId>cucumber-junit</artifactId>
  <version>1.0.0.RC20</version>
  <scope>test</scope>
</dependency>

我错过了什么吗?

更新我遗漏了一些东西:黄瓜功能文件必须位于子目录 src/test/resources/mypackage/ 中。否则不会被junit测试拾取。

当我将它们放在同一目录src/main/test/ 中时,我可以运行我的功能测试,所以这对我来说不是一个障碍。但我想了解整个设置。

【问题讨论】:

    标签: java cucumber cucumber-jvm cucumber-junit


    【解决方案1】:

    看看我的问题here

    您可以通过在选项注释中设置特征属性来指定类路径上的位置,例如

    @Cucumber.Options(features="src/test/resources")
    

    编辑:

    在新版本中的代码是

    @CucumberOptions(features="src/test/resources")
    

    【讨论】:

      【解决方案2】:

      classpath 选项在 Cucumber 文档中并不明显(它也不在 JavaDoc 中),我最终从 CLI documentation 推断它(编辑:链接已失效,找不到等效项),其中记录了其他位置选项。请参阅文档中的 List configuration options 部分。如何从多模块 Maven 项目的另一个模块中获取功能定义也不是很明显。

      这就是我在 Maven 多模块项目中前进(从 IDE 和命令行运行)的原因。

      @CucumberOptions(
              features = {"classpath:product"},
              //...
      )
      public class RunCukesTest extends AbstractTestNGSpringContextTests {
      

      我的功能文件所在的位置

      main-project
          sub-module-1
              src/test/java/com/foo/
                  RunCukesTest.java
              src/test/resources/product/
                  feature_1.feature
                  feature_2.feature
          sub-module-2
              ...
      

      我很高兴没有在路径中看到src/test/resources。请注意,路径中没有前导 /。使用类路径不那么脆弱,因为必须明确定义类路径(而不是当前工作目录)。

      【讨论】:

      • 这是正确的解决方案,所有其他指定“src/test/resources”的答案在某种意义上都是错误的,它们很脆弱,只能在 IDE 中正确运行。使用 'classpath:features' 确保在部署到 CI 构建环境时能够正常工作。
      • 感谢您的解决方案!我怀疑接受的答案实际上根本没有使用类路径。在我的例子中,我们将测试打包在一个 spring-boot 应用程序中。我希望使用类路径意味着可以将功能打包到可执行 jar 中。
      【解决方案3】:

      你可以使用

      @CucumberOptions(
          format = "pretty",
          tags = {"~@Ignore"},
          features = "src/test/resources/com/"  //refer to Feature file
      )
      

      用于扫描包中的所有功能文件

      【讨论】:

      • 很好的建议,因为 @Cucumber.Options 从版本 1.1.5 开始被弃用 ... xebee.xebia.in/index.php/2014/07/31/…
      • 谢谢!正在尝试已弃用的@Cucumber.Options
      • 再次感谢您展示新的@CucumberOptions!
      • 知识库在创建后如何保持有益!大约一年后,我被我的 cucumber-scala 项目卡住了(为什么周围没有足够的文档?),疯狂地搜索并最终到达这里以了解“Options”被“CucumberOptions”取代!好东西。谢谢。
      【解决方案4】:

      好的,我只能在星期一早上放这个...我使用的目录布局不正确,我忘记将黄瓜功能放入与我的包结构匹配的子目录中。

      确保您也在src/test/resources/中创建所需的包目录!

      【讨论】:

        【解决方案5】:

        一旦你使用

        import cucumber.api.CucumberOptions;
        

        您需要将以下内容添加到您的 pom.xml 中,否则“mvn test”将不起作用。而且您只能从 IDE 运行测试。 见:https://github.com/cucumber/cucumber-java-skeleton/blob/master/pom.xml

        <properties>
            <java.version>1.7</java.version>
            <junit.version>4.12</junit.version>
            <cucumber.version>1.2.2</cucumber.version>
            <maven.compiler.version>3.3</maven.compiler.version>
        </properties>
        
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>${maven.compiler.version}</version>
                    <configuration>
                        <encoding>UTF-8</encoding>
                        <source>${java.version}</source>
                        <target>${java.version}</target>
                        <compilerArgument>-Werror</compilerArgument>
                    </configuration>
                </plugin>
            </plugins>
        </build>
        

        【讨论】:

          【解决方案6】:

          或者你可以像https://cucumber.io/docs/reference/jvm#cli-runner 中描述的那样构建你的 cucumberoptions 参数并将其传递给 cucumber.api.cli.Main.run()。这是一个小例子:

          String arg = "classpath:MyFeature.feature --dry-run";
          String[] args = arg.split(" ");
          cucumber.api.cli.Main.run(args, Thread.currentThread().getContextClassLoader());
          

          并在您的 JUnit 测试中使用它。因此,您不必只使用其他参数为每个测试类创建单独的类。

          【讨论】:

            【解决方案7】:

            将功能文件放在运行器和步骤文件所在的 src/test/java 下,或者 把它放在 src/main/java 下,问题就会得到解决。

            别忘了说谢谢。:)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2021-06-14
              • 1970-01-01
              • 2016-03-28
              • 1970-01-01
              • 1970-01-01
              • 2018-10-20
              • 1970-01-01
              相关资源
              最近更新 更多