我正在使用带有WebDriver
框架的Selenium TestNG
在不同浏览器上的 Windows和MAC 平台上运行测试套件 - Chrome,IE,Firefox和Safari < / strong>即可。我的测试套件中有 300个测试用例。
问题是在我认为驱动程序没有响应的地方之间会跳过一些测试用例。但是,日志未能捕获为什么跳过测试用例的任何细节。
reporter class
扩展TestListenerAdapter
,因此使用onConfigurationSkip
方法将跳过的测试用例列在日志文件中。它只打印已跳过特定测试用例。
以下是一些参考代码片段
@Override
public void onConfigurationSkip(ITestResult testResult) {
LOGGER.info(String.format("Skipped Configuration for : %s", testResult.getMethod().getMethodName()));
}
public class TestClass {
private WebDriver driver;
@Parameters({ "platform", "browser"})
@BeforeClass
public void setUp(String platform, String browser) {
// Creates a new driver instance based on platform and browser details
driver = WebDriverFactory.getDriver(platform, browser);
// Login to web application
Utils.login(driver, username, password);
}
@Test
public void sampleTestMethod() {
// scripts for validating Web elements
}
@AfterClass
public void tearDown() {
driver.quit();;
}
}
观察:
driver.quit()
不保证驱动程序实例已关闭,因为我仍然可以在任务管理器中看到驱动程序实例正在运行。这又是间歇性的,有时只会发生。
在所有平台和浏览器上都会出现此问题
这是一个间歇性问题,随着测试用例中测试用例数量的增加,出现概率会增加
没有明确的跳过测试用例的模式。在某些浏览器和平台上随机跳过测试用例
随着测试套件的后续运行,跳过测试用例的发生概率会增加。我相信原因是越来越多未正确关闭的驱动程序实例继续在后台运行
通常测试类有5-15个测试方法,每次在driver
方法中创建新的@BeforeClass
实例,并在{{1}中关闭}
有什么建议吗?在此先感谢
答案 0 :(得分:0)
使用TestNG跳过Selenium测试用例的最常见原因是,如果您的方法依赖于其他方法,并且您依赖的方法失败。
答案 1 :(得分:0)
要获得有关跳过测试原因的信息,您可以在测试后的方法中实现,如下所示: -
@AfterMethod
public void afterTest(ItestResult result) {
Throwable t = result.getThrowable();
// with the object of t you can get the stacktrace and log it into your reporter
}
为避免测试被跳过,您可以在@Test注释后将 alwaysRun 参数设为true
@Test(alwaysRun=true)
要避免webdriver被重新启动,请使用@BeforeMethod和@AfterMethod注释对方法进行驱动程序清理,因此请尝试将 setUp 和 tearDown 方法的注释更改为和 @AfterMethod
答案 2 :(得分:0)
如果您在每次测试中打开和关闭浏览器都没问题,那么您应该使用@BeforeMethod或@AfterMethod而不是@BeforeClass和@AfterClass
如果您遵循以下代码及其输出,那么您会发现@BeforeMethod在每个测试注释方法之前执行,但@BeforeClass只对类中的所有方法执行一次。
由于我没有完整的代码进行分析,因此我可以假设您的测试试图重用错误的驱动程序实例。因此,最好的办法是在每次测试执行完成后关闭它。
<强>代码:强>
包com.autmatika.testng;
import org.testng.annotations。*;
公共类FindIt {
@BeforeClass
public void beforeClass(){
System.out.println("Before Class");
}
@AfterClass
public void afterClass(){
System.out.println("After Class");
}
@BeforeMethod
public void beforeTest(){
System.out.println("Before Test");
}
@AfterMethod
public void afterTest(){
System.out.println("After Test");
}
@Test
public void test1(){
System.out.println("test 1");
}
@Test
public void test2(){
System.out.println("test 2");
}
@Test
public void test3(){
System.out.println("test 3");
}
@Test
public void test4(){
System.out.println("test 4");
}
}
<强>输出:强>
Before Class
Before Test
test 1
After Test
Before Test
test 2
After Test
Before Test
test 3
After Test
Before Test
test 4
After Test
After Class
===============================================
Default Suite
Total tests run: 4, Failures: 0, Skips: 0
===============================================