@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
}
5条答案
按热度按时间gwo2fgha1#
在Cucumber JVM中本机没有这样的特性(请参见https://github.com/cucumber/cucumber-jvm/issues/515)。
但是,有几个解决方法:
@BeforeAll
和@AfterAll
,@BeforeClass
和@AfterClass
Before
钩子进行惰性单例初始化,使用JVM shutdown钩子进行拆卸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/
wfsdck302#
请点击此链接。这是@BeforeAll和@AfterAll的变通方法
https://github.com/cucumber/cucumber-jvm/issues/515
62lalag43#
根据the most recent docs,Cucumber提供了一个
BeforeAll
和AfterAll
钩子,在所有场景执行完毕后,它们将分别在任何场景之前运行。vdzxcuhz4#
据我所知,全局钩子不受Cucumber-JVM支持,但是,您可以尝试使用(标记的)钩子、@Before注解和静态字段。
mrwjdhj35#
我已经用类规则解决了这个问题,假设我们希望cubber测试启动一个
TestContainers
容器,假设我们正在测试REDIS(我们没有,但这是一个简单的例子)。上述原因导致
TestContainers
类GenericContainer
在cubble生命周期之前被初始化,然后被删除。您可以编写自己的自定义JUnit规则,扩展TestRule
,并使用它来使用自己的自定义设置来修饰测试的执行。这样做的一个常见问题是,您必须设法从基于每个场景创建的对象中访问在生命周期的这一点上创建的对象。然而,假定这个生命周期是Cucumber测试套件静态状态的一部分,您可以通过套件的静态字段访问测试规则对象。
我在这里有一篇关于这个的博客文章-https://codingcraftsman.wordpress.com/2020/01/20/extending-the-cucumber-test-lifecycle/