将 JUnit 挂钩与 Cucumber CLI Runner 结合使用

Using JUnit Hooks with Cucumber CLI Runner

我正在尝试使用 Cucumber 的 CLI Runner 并行 运行 Cucumber 的功能文件,我目前正试图弄清楚如何使 JUnit @BeforeClass 挂钩与 CLI Runner 一起工作.

目前,我的工作跑步者class看起来像这样:

@RunWith(Cucumber.class)
@CucumberOptions(
    plugin = {
      "pretty",
      "html:target/reports/basic/report.html",
      "json:target/reports/cluecumber/cucumber.json",
      "timeline:target/reports/timeline"
    },
    tags = "@RegressionTests",
    snippets = SnippetType.CAMELCASE,
    stepNotifications = true,
    features = "classpath:features",
    glue = "my.steps.package")
public class RegressionTestsIT {

  @BeforeClass
  public static void setup() {
    ContextHolder.setupTestContext();
  }
}

我的 CLI 命令如下所示:

java -cp "target/test-jar-with-dependencies.jar" io.cucumber.core.cli.Main -p "pretty" -p "html:target/reports/basic/report.html" -p "json:target/reports/cluecumber/cucumber.json" -p "timeline:target/reports/timeline" --threads 10 -g "my.steps.package" target/test-classes/features

我在测试时遇到了 NullPointerException,因为未正确设置 TestContext,因为未执行挂钩。

我试图将 Runner 的包和 Runner class 本身作为胶水包含进来,但没有成功。

还尝试让我的 Runner 扩展 io.cucumber.core.cli.Main 然后在 CLI 中执行我的 Runner 毫不奇怪它也没有工作,遗憾的是仍然得到 NPE。

虽然这个问题与 CLI Runner 的使用有关,但我对任何可能对我有帮助的答案都很满意 运行 无论采用何种方法并行处理多个功能文件。

JUnit @BeforeClass 对我不起作用。因为我有点赶时间,所以我没有费心继续尝试让它工作。我现在真的不需要 运行 管道中的命令,所以我完全可以在 IntelliJ 上 运行ning 它,只要它是 运行 并行的。

我的解决方案是创建一个自定义 CLI Runner,它 运行 是 Cucumber 的 CLI 运行 方法之前的上下文配置。

public class CLIRunner {

  public static void main(String[] args) {
    ContextHolder.setupTestContext();

    io.cucumber.core.cli.Main.run(
        new String[] {
            "-p", "pretty",
            "-p", "html:target/reports/basic/report.html",
            "-p", "json:target/reports/cluecumber/cucumber.json",
            "-p", "timeline:target/reports/timeline",
            "-g", "my.steps.package",
            "classpath:features",
            "--threads", "10"
        }, Thread.currentThread().getContextClassLoader());
  }
}

Using JUnit Rules

Cucumber supports JUnit's @ClassRule, @BeforeClass, and @AfterClass annotations. These will be executed before and after all scenarios. Using these is not recommended as it limits portability between different runners; they may not execute correctly when using the command line, IntelliJ IDEA, or Cucumber-Eclipse. Instead it is recommended to use Cucumber's hooks.

使用 CLI 时,JUnit 根本不参与,因此您不能使用任何 JUnit 注释。但是,从 Cucumber v7 开始,您可以使用 @BeforeAll@AfterAll 来声明在所有场景之前和之后执行的方法。

package io.cucumber.example;

import io.cucumber.java.AfterAll;
import io.cucumber.java.BeforeAll;

public class StepDefinitions {

    @BeforeAll
    public static void beforeAll() {
        // Runs before all scenarios
    }

    @AfterAll
    public static void afterAll() {
        // Runs after all scenarios
    }
}