使用TestNG框架使用Selenium WebDriver跳过测试用例

问题描述 投票:2回答:3

我正在使用Selenium WebDriverTestNG框架在Windows和MAC平台上运行不同浏览器上的测试套件 - Chrome,IE,Firefox和Safari。我的测试套件中有大约300个测试用例。

问题是在我认为驱动程序无响应的地方之间会跳过一些测试用例。但是,日志无法捕获测试用例被跳过的任何详细信息。

reporter class扩展了TestListenerAdapter,因此跳过的测试用例使用onConfigurationSkip方法列在日志文件中。它仅打印已跳过特定测试用例。

以下是一些代码片段供参考

来自Reporter Class的代码

@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实例,并在@AfterClass中关闭

有什么建议?提前致谢

selenium selenium-webdriver webdriver automated-tests testng
3个回答
0
投票

使用TestNG跳过Selenium测试用例的最常见原因是,如果您的方法依赖于其他方法,并且您依赖的方法失败。


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方法的注释分别更改为@BeforeMethod和@AfterMethod


0
投票

如果您在每次测试中打开和关闭浏览器都没问题,那么您应该使用@BeforeMethod或@AfterMethod而不是@BeforeClass和@AfterClass

如果您遵循以下代码及其输出,那么您会发现@BeforeMethod在每个测试注释方法之前执行,但@BeforeClass只对类中的所有方法执行一次。

由于我没有完整的代码进行分析,因此我可以假设您的测试试图重用错误的驱动程序实例。因此,最好的办法是在每次测试执行完成后关闭它。

码:

包com.autmatika.testng;

import org.testng.annotations。*;

公共类发现{

@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
===============================================
© www.soinside.com 2019 - 2024. All rights reserved.