Cucumber-JVM:Cucumber的@After钩子被执行两次

时间:2018-04-12 08:04:10

标签: testng cucumber-jvm

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

有谁知道为什么?

enter image description here

代码:

@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

在名为多个定义的功能文件中有警告“Volare Collector主页在浏览器中打开”。

请从此link下载我的源代码。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

答案 1 :(得分:0)

我假设你使用的是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(){

  }
}