cucumber测试
总览
本文涉及两件事:
- 我如何使beforeAll和AfterAll生命周期事件在Cucumber中发生?
- 在Cucumber测试运行之前,如何使用TestContainers设置被测系统?
不,您正在尝试在博客上进行SEO。
Cucumber的生命周期…
Cucumber的生命周期包括:
- 上钩之前–每个场景之前
- 挂机之后–每个场景之后
- 步骤前
- 步骤后
就是这样……您可以有条件地运行钩子。
如果有大生命周期怎么办?
您的意思是,如果您需要在每个测试运行的基础上而不是在每个方案的基础上启动被测系统,该怎么办? 还是进行一些后期测试清理?
看来Cucumber本身并不能解决这个问题。
生活有一种需要这种功能的方式。
有没有办法在Cucumber中运行之前和之后?
假设您正在使用JUnit 4,那么以下内容将适用。 我期望有一个等效的JUnit5,但尚未对其进行测试。
您需要了解的内容:
- CucumberJUnit运行器基于JUnit4
ParentRunner
- 此类支持JUnit
@Rule
批注。 特别是@ClassRule
- 尽管Cucumber本身不支持额外的生命周期,但事实证明JUnit4的内部结构将遵守
@ClassRule
规则
- 因此,如果您想围绕测试的执行创建某种行为,则需要创建一个
TestRule
对象作为Cucumber套件类的static
字段,并向其添加@ClassRule
。
现实生活中的场景
我们有一个应用程序需要部署在docker内部才能运行自动化包。 我们可以使用TestContainers在所有测试运行之前实现这一目标,并且这还将在测试运行结束时整理docker资源。
由于测试容器容器本身就是一个TestRule
因此将一个容器注入到测试中非常简单:
@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将容器放在给定逻辑端口的随机暴露端口上)。
就这么简单
使用这种使用测试规则的技巧,您可以拥有缺少的Cucumber生命周期挂钩,并且可以将TestContainers元素集成到测试中。
除了……在现实生活中,我要做的事情要复杂得多,因此构建了一个自定义的复合测试规则,以将整个过程编织在一起,并使用@ClassRule
来将其链接到生命周期。
而且,如果您使用的是JUnit5,请考虑使用JUnit5扩展而不是规则,并且可以通过某种方式来生成自定义扩展来做很多相同的事情,或者只是以正确的顺序获取扩展注释,而JUnit5可能为您做这一切。
翻译自: https://www.javacodegeeks.com/2020/01/extending-the-cucumber-test-lifecycle.html
cucumber测试