【问题标题】:Cucumber-JVM: Cucumber's @After hook is executed twiceCucumber-JVM:Cucumber 的 @After 钩子被执行了两次
【发布时间】:2018-04-12 08:04:10
【问题描述】:

我正在实施 Cucumber Testng 以用于学习目的。我已经意识到 @After 钩子方法执行了两次。我可以通过调试集和测试报告输出来确认它。我只运行 1 个功能文件,我的测试报告显示两个具有相同类名的条目。

有人知道为什么吗?

代码:

@After
    public void tearDown(Scenario scen) throws IOException {
        ExtentTest logger = reportMgr.getLogger();
        String feature = getClass().getName() + " Feature";    //+ "." + Thread.currentThread().getStackTrace()[1].getMethodName().toString();

        logger = reportMgr.getExtent().createTest(feature);

        String screenShot = CaptureScreenshot.captureScreen(WebDriverManager.driver, CaptureScreenshot.generateFileName(feature));
        if (!scen.isFailed()) {
            logger.pass("Pass");
            logger.addScreenCaptureFromPath(screenShot);
        } else {
            logger.fail("Fail");
            logger.addScreenCaptureFromPath(screenShot);
        }
    }

功能文件:

@Login_Valid Feature: Login to Volare Collector Description:  As a user, I want login to Volare Collector 

  Scenario: Valid Login
    Given Volare Collector Home Page opens in browser
    When I login to Volare Collector with Username and Password
    Then Page navigate to Volare Collector Home Page

功能文件中有一个名为 Multiple Definitions “Volare Collector Home Page opens in browser”的警告。

请从link下载我的源代码。

【问题讨论】:

  • 同时添加功能文件。此功能文件中有两种情况吗?
  • 功能文件中只有一个场景,但有关于“Volare Collector Home Page opens in browser”的多个定义的警告。
  • 您应该只有一个步骤的唯一定义。奇怪的是你也没有例外。
  • 你确定你只定义了一个 \@After 钩子吗?每个 \@After 钩子都会被执行,所以如果你有两个,每个都会被执行。发布您的所有代码。
  • 请从上面的链接下载源代码。

标签: testng cucumber-jvm


【解决方案1】:

testng.xml 调用 TestRunner 类。在cucumberoptions 中有no tags option,因此没有基于标签的过滤。因此,它将拾取features 选项中给出的文件夹中的所有功能文件 - "src/Features" 即。 Login.feature 和 Logout.feature。

每个功能文件都有每个场景。因此,总共有 2 个场景,因此将运行 2 个测试。这解释了为什么您会在报告中看到 2 个测试

当每个场景运行时,它们将运行任何现有的Before and After hooks。所以对于2个场景,钩子会运行两次

钩子在本质上也是全局,即只要它们存在于glue(glue = {"Step_Definitions"}) 中定义的选项中的任何类中,它们就会被拾取。在您的情况下,您在 Login 和 Logout 类中有 两个 Before 钩子,您可能想看看修复它。使用 Before 钩子并在 value 选项中传递一个标签过滤器。

Login类中定义的单After hook这段代码

String feature = getClass().getName();          
logger = reportMgr.getExtent().createTest(feature);

这意味着测试的名称将始终是完整的类名,即。 Step_Definitions.Login。因此,它显示为 2 个名称相同但名称不同的测试

【讨论】:

    【解决方案2】:

    我假设您使用的是 TestNG 6.8 或更高版本

    使用以下测试类模板并检查您是否有问题

    import org.testng.annotations.AfterClass;
    import org.testng.annotations.BeforeClass;
    import org.testng.annotations.Test;
    
    class PlaygroundTest {
    
      @BeforeClass
      public void setUp(){
    
      }
    
      @AfterClass
      public void tearDown() {
    
      }
    
      @Test
      public void test(){
    
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多