java 全球BeforeAll钩 cucumber -jvm?

plicqrtu  于 2023-01-07  发布在  Java
关注(0)|答案(5)|浏览(230)

Ruby版本的cubber支持global before hook,一个放在features/support目录中的 *.rb文件只被调用一次,在所有场景运行之前,见https://github.com/cucumber/cucumber/wiki/Hooks#global-hooks
这似乎是一种很好的方法,可以确保在运行任何测试之前填充数据库(在测试期间以只读方式使用)(从而使数据库处于已知状态)。
Java版本的cubber是否有类似的特性?

gwo2fgha

gwo2fgha1#

在Cucumber JVM中本机没有这样的特性(请参见https://github.com/cucumber/cucumber-jvm/issues/515)。
但是,有几个解决方法:

  • 使用测试框架的钩子:
  • 用于JUnit 5的@BeforeAll@AfterAll
  • 用于JUnit 4的@BeforeClass@AfterClass
  • 使用Cucumber Before钩子进行惰性单例初始化,使用JVM shutdown钩子进行拆卸
  • 实现Cucumber EventListener并订阅TestRunStartedTestRunFinished事件
  • 使用构建框架的集成测试生命周期特性,例如Maven的pre-integration-testintegration-testpost-integration-test阶段和maven-failsafe-plugin

您还必须解决将这样一个设置步骤的结果(例如随机端口号)注入到您的测试中的问题。
我写了一篇博客文章来涵盖所有细节:https://metamorphant.de/blog/posts/2020-03-10-beforeall-afterall-cucumber-jvm-junit/

wfsdck30

wfsdck302#

请点击此链接。这是@BeforeAll和@AfterAll的变通方法
https://github.com/cucumber/cucumber-jvm/issues/515

62lalag4

62lalag43#

根据the most recent docs,Cucumber提供了一个BeforeAllAfterAll钩子,在所有场景执行完毕后,它们将分别在任何场景之前运行。

vdzxcuhz

vdzxcuhz4#

据我所知,全局钩子不受Cucumber-JVM支持,但是,您可以尝试使用(标记的)钩子、@Before注解和静态字段。

mrwjdhj3

mrwjdhj35#

我已经用类规则解决了这个问题,假设我们希望cubber测试启动一个TestContainers容器,假设我们正在测试REDIS(我们没有,但这是一个简单的例子)。

@RunWith(Cucumber.class)
@CucumberOptions(...)
public class TestRunner {
    @ClassRule
    static GenericContainer REDIS = new GenericContainer<>("redis:5.0.3-alpine")
        .withExposedPorts(6379);

    // obviously we weren't testing redis, but this gives you the idea of a container
}

上述原因导致TestContainersGenericContainer在cubble生命周期之前被初始化,然后被删除。您可以编写自己的自定义JUnit规则,扩展TestRule,并使用它来使用自己的自定义设置来修饰测试的执行。
这样做的一个常见问题是,您必须设法从基于每个场景创建的对象中访问在生命周期的这一点上创建的对象。然而,假定这个生命周期是Cucumber测试套件静态状态的一部分,您可以通过套件的静态字段访问测试规则对象。
我在这里有一篇关于这个的博客文章-https://codingcraftsman.wordpress.com/2020/01/20/extending-the-cucumber-test-lifecycle/

相关问题