场景是这样的: 运行我的Cucumber功能的TestNG测试运行器。 有一个包含WebBrowsers的静态共享Selenium WebDriver池。 在TestNG测试结束时,我想关闭我的浏览器,所以我正在使用@AfterClass注释。 进行调用,代码运行以关闭浏览器,但实际上它们实际上并没有。
如果我在调用后添加Thread.sleep一秒钟,浏览器就会关闭。
JUnit测试运行器设法每次都关闭浏览器。关于TestNG有什么特别的(错误的)?
链接到违规的测试运动员在这里:
随意克隆并亲自查看结果。
违反测试跑步者的代码:
package uk.co.oliverdelange.testrunners.testng;
import cucumber.api.CucumberOptions;
import cucumber.api.testng.AbstractTestNGCucumberTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import uk.co.oliverdelange.webbrowser.BrowserPool;
@CucumberOptions(tags = "~@Ignore",
features = "src/test/resources/uk/co/oliverdelange/cucumber/",
glue = "uk.co.oliverdelange.cucumber.tests",
format = {"pretty","html:CucumberReports/html/","json:CucumberReports/cucumber.json"},
monochrome = true
)
public class TestNGCucumberRunner extends AbstractTestNGCucumberTests {
@BeforeClass
public static void beforeClass() {
System.out.println("Do stuff here before the cucumber tests happen");
}
@AfterClass
public static void afterClass() { //FIXME why is this not being called?
System.out.println("Do stuff here after the cucumber tests happen");
System.out.println("Like shutting down all the web browsers...");
BrowserPool.closeAll();
//FIXME: JUnit manages to close the browser before closing the tests, but somehow TestNG doesn't - what!?
}
}
答案 0 :(得分:0)
我从未见过有人在AfterClass方法的单个调用中调用关闭webdriver实例的组/池。通常,人们所做的是在BeforeTest中实例化浏览器,然后在AfterTest方法中使用.quit调用关闭单个非静态类webdriver成员。所以,我的第一印象是,看着你的代码,你正在做一些非标准和实验性的事情。 TestNG非常棒,它可以为您提供流程,并且在这种情况下很容易跟踪webdriver实例。我不会再使用JUnit ......在我了解TestNG之后,我确信它远远优于它。
例如:
您可以将可选的Object [] arg传递给使用BeforeMethod注释的方法,并且可以从中检索参数 即将传递给测试方法,例如在调用obj.start时打开浏览器的WebDriver帮助程序对象(在数据提供程序方法中生成)。天才。
- 醇>
您可以将ITestResult传递给AfterTest方法,然后从结果中获取内容并使用该信息发布过程内容,例如 完成测试后发送SauceLabs REST请求以将测试作业标记为已通过。