全球之前为黄瓜jvm挂钩?

时间:2013-11-04 14:38:54

标签: java cucumber cucumber-jvm

黄瓜的红宝石版本支持全局挂钩。在任何和所有场景运行之前,放置在features / support目录中的* .rb文件显然只被调用一次。 见https://github.com/cucumber/cucumber/wiki/Hooks#global-hooks

这似乎是确保在任何测试运行之前填充数据库(在测试期间以只读方式使用)(因此处于已知状态)的好方法。

黄瓜的Java版本是否有类似的功能?

4 个答案:

答案 0 :(得分:5)

请点击此链接。 这是@BeforeAll和@AfterAll

的解决方法

https://github.com/cucumber/cucumber-jvm/issues/515

答案 1 :(得分:2)

Cucumber JVM本身没有这种功能(请参见https://github.com/cucumber/cucumber-jvm/issues/515)。

但是,有两种解决方法:

  • 使用测试框架的钩子:
    • JUnit 5的{li> @BeforeAll@AfterAll
    • @BeforeClass@AfterClass for JUnit 4
  • 使用Cucumber Before钩子进行懒惰的单例初始化,并使用JVM shutdown钩子进行拆除
  • 实施黄瓜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/

答案 2 :(得分:0)

据我所知,Cucumber-JVM不支持全局钩子。但是,您可以尝试(标记)钩子,@ Before注释和作为解决方法的静态字段。 Have a look here举个例子。

答案 3 :(得分:0)

我已经使用类规则解决了这个问题。假设我们希望黄瓜测试启动一个正在测试的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在黄瓜生命周期之前被初始化,然后在之后被拆除。您可以编写自己的自定义JUnit规则,扩展TestRule并将其用于通过您自己的自定义设置来装饰测试的执行。

一个常见的问题是,您必须以某种方式从按场景创建的事物中访问生命周期中此时创建的对象。但是,鉴于此生命周期是Cucumber测试套件静态状态的一部分,您只需通过套件的静态字段访问测试规则对象即可。

我在这里有一篇博客文章-https://codingcraftsman.wordpress.com/2020/01/20/extending-the-cucumber-test-lifecycle/