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

Posted

技术标签:

【中文标题】TestNG:@BeforeClass 方法失败时会跳过所有后续测试类?【英文标题】:TestNG: All subsequent Test classes are skipped when @BeforeClass method fails? 【发布时间】:2015-10-07 05:18:08 【问题描述】:

我的设置:

一个TestBase 类,包含一个@BeforeClass 方法 几个测试类从 TestBase 类扩展并且还包含一个 @BeforeClass 方法 testNG 6.8.8

为什么要这样设置?:

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

发生了什么:

当我通过 testNG xml 文件运行测试并且其中一个测试类的@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);
    

【问题讨论】:

也许this 回答会有所帮助 @ErkiM。谢啦!这肯定会带来一些启示。还有一个问题,为什么所有后续的测试都被跳过了,只是因为一个!课程失败。 我相信这是设计使然,因为您的测试取决于@BeforeClass 的结果并且它失败了,因此执行被停止。为了解决这个问题,你可以用 alwaysRun 注释你的测试,docs :alwaysRun If set to true, this test method will always be run even if it depends on a method that failed. 我自己没有测试过,让我知道它对你来说是如何工作的。 我想测试中的错误 - 似乎已在 6.9.5 中修复:github.com/cbeust/testng/issues/471 @niharika_neo 非常感谢!!!这解决了整个问题!你不会把这个作为答案吗?因为这就是关于我更新的问题(testng 版本号 6.8.8)的内容 - 否则我必须自己做这件事,你不会得到全部功劳;-) 【参考方案1】:

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

【讨论】:

不幸的是,该错误尚未完全解决 -> 如果孩子有 \@beforeClass 并且父类有 \@beforeClass,则当一个孩子在其自己的 \@beforeClass 方法期间失败时跳过孩子的问题仍然存在和 \@afterClass。 这里也一样 - 升级并没有为我解决问题。切换到@BeforeSuite@AfterSuite 确实如此。 即使在 6.11 上仍然可以看到该错误【参考方案2】:

尝试添加@AfterClass(alwaysrun = true) 或/和@AfterMethod(alwaysrun=true),因为默认情况下,如果未完成 BeforeClass 或 BeforeMethod,则会跳过它们。

有关 testNG 配置失败、策略和 alwaysRun 的文档解释了配置失败是否/何时导致侦听器方法(alwaysRun 和其他侦听器)被跳过、失败策略和最佳实践。

【讨论】:

以上是关于TestNG:@BeforeClass 方法失败时会跳过所有后续测试类?的主要内容,如果未能解决你的问题,请参考以下文章

TestNG中BeforeClass和BeforeTest的区别

TestNG的group注解

TestNG BeforeClass BeforeMethod Test AfterClass AfterMethod

testNG注解的使用和执行顺序

TestNg注解使用

TestNG配置注解