我正在实施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
在名为多个定义的功能文件中有警告“Volare Collector主页在浏览器中打开”。
请从此link下载我的源代码。
答案 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(){
}
}