【问题标题】:How do I get the result of a Cucumber feature如何获得 Cucumber 功能的结果
【发布时间】:2016-11-12 01:36:40
【问题描述】:

我正在尝试在 JUnit 5 Jupiter 中运行 Cucumber 功能。我从 Cucumber-jvm 源代码中提取了一些代码,并将其改编为 JUnit 5 的 TestFactory。它正在运行:当我运行所有 JUnit 测试时,我看到我的功能正在运行(这是 Kotlin 代码,但同样适用于 Java):

@CucumberOptions(
        plugin = arrayOf("pretty"),
        features = arrayOf("classpath:features")
)
class Behaviours {
    @TestFactory
    fun loadCucumberTests() : Collection<DynamicTest> {
        val options = RuntimeOptionsFactory(Behaviours::class.java).create()
        val classLoader = Behaviours::class.java.classLoader
        val resourceLoader = MultiLoader(classLoader)
        val classFinder = ResourceLoaderClassFinder(resourceLoader, classLoader)
        val runtime = Runtime(resourceLoader, classFinder, classLoader, options)
        val cucumberFeatures = options.cucumberFeatures(resourceLoader)
        return cucumberFeatures.map<CucumberFeature, DynamicTest> { feature ->
            dynamicTest(feature.gherkinFeature.name) {
                var reporter = options.reporter(classLoader)
                feature.run(options.formatter(classLoader), reporter, runtime)
            }
        }
    }
}

但是,JUnit 报告说每个功能都成功了,无论它是否真的成功。当功能失败时,结果会正确打印出来,但生成的DynamicTest 通过。 gradle test 和 Intellij 都没有注意到错误:我必须检查文本输出。

我想我必须弄清楚,在作为第二个参数传递给dynamicTestExecutable 中,该功能的结果是什么,并在适当的时候提出一个断言。此时如何确定featurefeature.gherkinFeature 的结果?

有没有办法获得功能中每个场景的结果?或者更好的是,有没有办法运行特定场景,以便我可以为每个场景创建一个 DynamicTest,从而在 JUnit 中提供更好的报告粒度?

【问题讨论】:

  • 您可以使用 After 挂钩并将 Scenario 对象传递给它。场景类有 getStatus() 返回已通过、失败、未定义、已跳过、待处理或返回布尔值的 isFailed()。
  • 也许this question 可以帮助你。
  • 在您的示例中reporter 是什么类型?我对 Junit5 的研究不多,但是对于 junit4 的集成,这应该是一个 JunitReporter,它将信息转发到一个 junit RunNotifier
  • 几个月后回到这里。创建一个 Junit5 记者打破了这一点。如果时间允许,我也许可以在下周完成这项工作。
  • 请注意 Cucumber 还不支持 JUnit 5:github.com/cucumber/cucumber-jvm/issues/1149

标签: java cucumber kotlin cucumber-jvm junit5


【解决方案1】:

要将 Cucumber 场景的结果记录为 JUnit5,我发现实现 JunitLambdaReporter 是最简单的,它本质上是现有 JunitReporter 的更简单版本。一旦您的记者记住了当前场景,您就可以创建一个使用此逻辑的@TestFactory

return dynamicTest(currentScenario.getName(), () -> {
  featureElement.run(formatter, reporter, runtime);
  Result result = reporter.getResult(currentScenario);

  // If the scenario is skipped, then the test is aborted (neither passes nor fails).
  Assumptions.assumeFalse(Result.SKIPPED == result);

  Throwable error = result.getError();
  if (error != null) {
    throw error;
  }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    • 1970-01-01
    • 2012-04-02
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多