cucumber 的 ruby 版本支持全局的 before 钩子。在任何和所有场景运行之前,放置在 features/support 目录中的 *.rb 文件显然只被调用一次。见https://github.com/cucumber/cucumber/wiki/Hooks#global-hooks
这似乎是确保数据库(在测试期间以只读方式使用)在任何测试运行之前被填充(因此处于已知状态)的好方法。
Java 版本的 Cucumber 是否有类似的功能可用?
cucumber 的 ruby 版本支持全局的 before 钩子。在任何和所有场景运行之前,放置在 features/support 目录中的 *.rb 文件显然只被调用一次。见https://github.com/cucumber/cucumber/wiki/Hooks#global-hooks
这似乎是确保数据库(在测试期间以只读方式使用)在任何测试运行之前被填充(因此处于已知状态)的好方法。
Java 版本的 Cucumber 是否有类似的功能可用?
请点击此链接。这是@BeforeAll 和@AfterAll 的解决方法
Cucumber JVM 本身没有这样的特性(参见https://github.com/cucumber/cucumber-jvm/issues/515)。
但是,有几个解决方法:
@BeforeAll
@AfterAll
对于 JUnit 5 ,@BeforeClass
对于JUnit @AfterClass
4Before
钩子进行惰性单例初始化,使用 JVM 关闭钩子进行拆卸EventListener
并订阅TestRunStarted
和TestRunFinished
事件pre-integration-test
、integration-test
、post-integration-test
阶段和maven-failsafe-plugin
.您还必须解决将此类设置步骤的结果(例如随机端口号)注入测试的问题。
我写了一篇博客文章来涵盖所有细节:https ://metamorphant.de/blog/posts/2020-03-10-beforeall-afterall-cucumber-jvm-junit/
As far as I know global hooks are not supported by Cucumber-JVM. However, you could try (tagged) hooks, @Before annotations and as a work-around static fields. Have a look here for an example.
我已经使用类规则稍微解决了这个问题。假设我们希望我们的黄瓜测试启动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
}
以上导致TestContainers
类GenericContainer
在黄瓜生命周期之前被初始化,然后在之后被拆除。您可以编写自己的自定义 JUnit 规则,扩展TestRule
并使用它来使用您自己的自定义设置来装饰测试的执行。
一个常见的问题是,您必须以某种方式从基于每个场景创建的事物中访问生命周期中此时创建的对象。但是,鉴于此生命周期是 Cucumber 测试套件静态状态的一部分,您可以通过套件的静态字段访问测试规则对象。
我在这里有一篇关于此的博客文章 - https://codingcraftsman.wordpress.com/2020/01/20/extending-the-cucumber-test-lifecycle/