AfterAll 全局钩子 cucumber-jvm
AfterAll global hook cucumber-jvm
我在集成测试中使用 cucumber-jvm
,我需要在所有场景完成后执行一些代码,只需执行一次。
仔细阅读了 this and reviewed this reported 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
)是可以的。然而,尽管它有效,但我完全不确定使用 Runtime.getRuntime().addShutdownHook()
的 AfterAll
模拟是否是一个好的做法。
所以,这些是我的问题:
- 我应该避免
Runtime.getRuntime().addShutdownHook()
来实施 AfterAll
吗?
- 是否有其他更好的选择来模拟 cucumber-jvm 中的
AfterAll
行为?
在此先感谢您的帮助。
可能更好的方法是使用构建工具,如 Ant、Maven 或 Gradle 进行设置和拆卸操作,这是 集成测试的一部分.
使用 Maven Fail Safe Plug-in 时,用于设置集成测试。阶段 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 开始,以下 class 相当于 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) { }
}
我在集成测试中使用 cucumber-jvm
,我需要在所有场景完成后执行一些代码,只需执行一次。
仔细阅读了 this and reviewed this reported 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
)是可以的。然而,尽管它有效,但我完全不确定使用 Runtime.getRuntime().addShutdownHook()
的 AfterAll
模拟是否是一个好的做法。
所以,这些是我的问题:
- 我应该避免
Runtime.getRuntime().addShutdownHook()
来实施AfterAll
吗? - 是否有其他更好的选择来模拟 cucumber-jvm 中的
AfterAll
行为?
在此先感谢您的帮助。
可能更好的方法是使用构建工具,如 Ant、Maven 或 Gradle 进行设置和拆卸操作,这是 集成测试的一部分.
使用 Maven Fail Safe Plug-in 时,用于设置集成测试。阶段 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 开始,以下 class 相当于 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) { }
}