我在集成测试中使用cucumber-jvm
,我需要在所有方案完成后执行一些代码,只需执行一次。
在仔细阅读了this之类的帖子并审核了此报告issue之后,我完成了这样的事情:
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
)很好。但是,虽然它有效,但我完全不确定使用AfterAll
进行Runtime.getRuntime().addShutdownHook()
模拟是不是很好。
所以,这些是我的问题:
Runtime.getRuntime().addShutdownHook()
实施AfterAll
吗?AfterAll
行为吗?提前感谢您的帮助。
答案 0 :(得分:3)
可能更好的方法是使用构建工具(如Ant,Maven或Gradle)进行设置和拆除操作,这些操作是集成测试的一部分。
使用Maven Fail Safe Plug-in时,用于设置集成测试。阶段pre-integration-test
,通常用于设置数据库和启动Web容器。然后运行集成测试(阶段integration-test
)。然后运行阶段post-integration-test
,用于关闭和关闭/删除/清理事物。
INFO 如果通过JUnit运行Cucumber测试,以下可能也值得考虑
如果它更简单,设置更小,你可以查看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();
}
};
答案 1 :(得分:0)
从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<String> gluePaths;
@Override
public void loadGlue(Glue glue, List<String> 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) { }
}