TestNG:当@BeforeClass方法失败时,会跳过所有后续的测试类?

时间:2015-07-17 13:09:41

标签: java selenium selenium-webdriver annotations testng

我的设置:

  • 包含@BeforeClass方法的 TestBase类
  • 从TestBase类扩展并包含@BeforeClass方法的几个测试类
  • testNG 6.8.8

为什么要这样设置?:

  • 我需要TestBase类中的@BeforeClass来提供所有测试类所需的设置,并且我不想在每个Test类中重复。例如,与线程ID相关的登录凭据。
  • TestBase类还实例化Selenium WebDriver
  • 我需要Test类中的@BeforeClass来初始化所有@Test方法需要使用的所有内容,但是只需要(或必须)为所有测试构建/调用一次。这包括对所述WebDriver实例的调用(这是"普通"构造函数在这里无法工作的原因)

以下是发生的事情:

当我通过testNG xml文件运行测试时,其中一个Test类的@BeforeClass 方法中存在异常,那么 TestNG会跳过所有后续测试类< /强>

为什么会这样?如何预防?

例如,当我将TestBase类中的注释更改为 @BeforeSuite 时,所有测试都会运行,即使@BeforeClass中存在异常方法

实施例

运行xml文件时,将跳过完整的RunAllTestClasses02类。

testNG xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<suite name = "MiscSuite">
    <test name = "MiscTest">
        <classes >
            <class name="drkthng.misc.RunAllTestClasses01" />
            <class name="drkthng.misc.RunAllTestClasses02" />
        </classes>
    </test>
</suite>

使用@BeforeClass方法的TestBase类:

public abstract class RunAllTestClassesBase {

    @BeforeClass
    public void beforeClass() {
        // do something that all Test classes will need
    }
}

在@BeforeClass方法中抛出异常的测试类:

public class RunAllTestClasses01 extends RunAllTestClassesBase {

    @BeforeClass
    public void beforeClass() {
        Assert.assertTrue(false);
    }

    @Test
    public void Test01() {
        Assert.assertTrue(true);
    }
}

2 个答案:

答案 0 :(得分:5)

这是Testng中的一个错误。在6.9.5中解决。请升级。

答案 1 :(得分:-1)

尝试添加io.emit("hash", cookie)或/和@AfterClass(alwaysrun = true),默认情况下,如果未完成BeforeClass或BeforeMethod,则会跳过它们。

有关testNG配置失败,策略和alwaysRun的文档说明是否/何时配置失败导致跳过侦听器方法(@AfterMethod(alwaysrun=true)和其他侦听器),失败策略和最佳实践。