簡體   English   中英

AfterAll全球鈎黃瓜-jvm

[英]AfterAll global hook cucumber-jvm

我在集成測試中使用了cucumber-jvm ,我需要在所有場景完成后執行一些代碼,只需執行一次。

仔細閱讀一些職位等之后, 和審查報告的這個問題 ,我已經完成它做這樣的事情:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM