21

我尝试使用 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/,所以这对我来说不是一个障碍。但我想了解整个设置。

4

7 回答 7

19

看看我的问题

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

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

编辑:

在新版本中的代码是

@CucumberOptions(features="src/test/resources")
于 2012-12-13T22:49:41.050 回答
18

classpath选项在 Cucumber 文档中并不明显(它也不在 JavaDoc 中),我最终从CLI 文档中推断出它(编辑:链接已失效,找不到等效项),其中记录了其他位置选项。请参阅 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路上看到。请注意,路径中没有前导/。使用类路径不那么脆弱,因为必须明确定义类路径(而不是当前工作目录)。

于 2016-08-03T04:09:32.397 回答
7

您可以使用

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

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

于 2014-07-08T10:53:15.330 回答
5

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

确保你也创建了所需的包目录src/test/resources/

于 2012-03-12T07:27:01.637 回答
1

一旦你使用

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>
于 2015-11-15T23:26:58.997 回答
1

或者您可以只构建您的 cucumberoptions 参数,就像在https://cucumber.io/docs/reference/jvm#cli-runner中描述的那样,并将其传递给 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 测试中使用它。因此,您不必仅使用其他参数为每个测试类创建单独的类。

于 2016-02-05T16:33:10.287 回答
-8

通过将功能文件放在src/test/java下运行程序和步骤文件的位置,或者将其放在src/main/java下,问题将得到解决。

别忘了说声谢谢。:)

于 2017-04-07T11:35:57.767 回答