将 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());
}
}
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
}
}
我正在尝试使用 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());
}
}
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
}
}