AfterAll全球钩黄瓜-jvm
我在集成测试中使用了cucumber-jvm
,我需要在所有场景完成后执行一些代码,只需执行一次。
在仔细阅读了这样的post并回顾了这个报道的问题之后 ,我完成了这样的事情:
public class ContextSteps { private static boolean initialized = false; @cucumber.api.java.Before public void setUp() throws Exception { if (!initialized) { // Init context. Run just once before first scenario starts Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { // End context. Run just once after all scenarios are finished } }); initialized = true; } } }
我认为以这种方式完成的上下文初始化(相当于BeforeAll
)很好。 但是,虽然它正在工作,但我完全不确定使用Runtime.getRuntime().addShutdownHook()
的AfterAll
模拟是一个好习惯。
所以,这些是我的问题:
- 我应该避免使用
Runtime.getRuntime().addShutdownHook()
来实现AfterAll
吗? - 还有其他更好的选择来模拟cucumber-jvm中的
AfterAll
行为吗?
在此先感谢您的帮助。
可能更好的方法是使用构建工具,如Ant,Maven或Gradle进行设置和拆除操作,这些都是集成测试的一部分。
使用Maven Fail Safe插件时 ,用于设置集成测试。 有阶段pre-integration-test
,通常用于设置数据库和启动Web容器。 然后运行集成测试(阶段integration-test
)。 然后运行阶段post-integration-test
,用于关闭和关闭/删除/清理事物。
INFO如果Cucumber测试是通过JUnit运行的,那么以下也可能值得考虑
如果它更简单,设置更小,你可以查看JUnit @BeforeClass和@AfterClass。 或者实现一个JUnit @ClassRule,它有自己的before()
和after()
方法。
@ClassRule public static ExternalResource resource = new ExternalResource() { @Override protected void before() throws Throwable { myServer.connect(); } @Override protected void after() { myServer.disconnect(); } };
从Cucumber 2.4.0开始,下面的类给了我相当于Junit的@BeforeClass。
您可以将它放在test / java / cucumber / runtime中。
package cucumber.runtime; //cannot change. can be under /test/java import cucumber.runtime.io.ResourceLoader; import cucumber.runtime.snippets.FunctionNameGenerator; import gherkin.pickles.PickleStep; import java.util.List; public class NameThisClassWhatever implements Backend { private Glue glue; private List gluePaths; @Override public void loadGlue(Glue glue, List gluePaths) { this.glue = glue; this.gluePaths = gluePaths; //Any before steps here } @Override public void disposeWorld() { //any after steps here } @Override public void setUnreportedStepExecutor(UnreportedStepExecutor executor) { } @Override public void buildWorld() { } @Override public String getSnippet(PickleStep p, String s, FunctionNameGenerator fng) { return null; } public NameThisClassWhatever(ResourceLoader resourceLoader) { } }