使用 JUnit 5 @Tag运行 JUnit 4 测试(在 Vintage 执行引擎下)



目前,据我所知,Cucumber支持通过老式执行引擎在JUnit 5上运行。

假设我有以下测试运行程序:

@RunWith(Cucumber.class)
@CucumberOptions(plugin = { "pretty", "html:target/cucumber" },
features={ "src/test/resources" },
strict = true)
@Tag("ACCEPTANCE_TEST") 
public class TestRunner { }

如果我使用 JUnit 5 中定义为"ACCEPTANCE_TEST"的标签表达式运行它,它不会被拾取并运行。

但是,如果我使用定义为 NOT 的表达式运行它(对于测试类来说也是如此(,例如"!UNIT_TEST",然后它将被拾起并运行。

如何将 JUnit 5 标记与 JUnit 4 测试运行程序(如上面的运行程序(混合,以便它适用于标记表达式的正匹配?

TLDR

你不能。

仍然TLDR

你不能,至少不能不重新实现Cucumber的JUnit4运行器所做的大部分工作。

说来话长

要理解原因,您必须掌握某些术语的差异:

  • JUnit 4:包含测试编写 API、测试执行器、运行测试的 API 以及至少两种不同的扩展机制(规则和运行器(的单个模块(jar 文件(。
  • Cucumber
  • JUnit4 runner:Cucumber 与 JUnit 4 集成的方式。通过@RunWith(Cucumber.class)激活
  • JUnit 5:一个运行不同测试引擎的平台,它包含几个模块,提供供 IDE 和构建工具使用的 API,以及用于插件测试引擎的 SPI。
  • Vintage:在 JUnit 5 平台中使用 JUnit 4 的测试引擎
  • Jupiter:与JUnit 5平台同步发展并由同一团队维护的新测试引擎。

事情是这样的:@Tag注释是木星的一个特征,不可能与Cucumber的JUnit 4跑步者一起使用。JUnit 5 使用 Cucumber 的方法是 Cucumber 测试引擎:https://github.com/cucumber/cucumber-jvm/tree/master/junit-platform-engine。AFAIU 它有自己的标记机制并且不使用@Tag因为不同的测试引擎并排工作但不共享功能。

最新更新