AfterAll全球钩黄瓜-jvm

时间:2015-07-22 12:31:27

标签: java cucumber bdd cucumber-jvm

我在集成测试中使用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吗?
  • 还有其他更好的选择来模仿cucumber-jvm中的AfterAll行为吗?

提前感谢您的帮助。

2 个答案:

答案 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)  { }
}