不是失败的TestNG失败

Posted

技术标签:

【中文标题】不是失败的TestNG失败【英文标题】:TestNG failures which aren't failures 【发布时间】:2014-05-21 05:05:38 【问题描述】:

我已将通过 TestNG 执行的复杂 UI 测试框架添加到我们不拥有的大型企业应用程序(我们是用户)。

测试框架解析来自系统的数据,适合使用查询构建器进行测试;有时该数据已过时并且会引发预期的异常。这些异常意味着测试无法完成,但并没有真正失败。

我正在寻找一种方法来中止那个单独的测试,而不是让它失败。每次构建大约执行 6 次测试(稍作更改),所以我不关心每个构建是否有 1-2 次中止,但需要使当前标记为失败的中止静音;除了让他们通过之外,还有其他选择吗?这似乎是一个糟糕的选择?

【问题讨论】:

试试这个:konigsberg.blogspot.co.il/2007/11/…@Test(expectedExceptions = PlaneFullException.class) @ran 我不相信预期异常有效,因为它们需要它发生,我只想在它们发生时让它安静(10-20% 的时间)。 【参考方案1】:

另外两个选项 :) 这些将有助于将测试标记为已跳过而不是失败或通过

    捕获您期望的异常并从您的@Test 方法中抛出一个SkipException 或者

    在 afterInvocation 方法中实现 IInvokedMethodListener 做类似的事情

    public void afterInvocation(IInvokedMethod method, ITestResult testResult)

    if(testResult.getThrowable().getClass().equals(YourExceptionClass.class))
         testResult.setStatus(TestResult.SKIP);
    

【讨论】:

完美运行,这正是我所追求的!【参考方案2】:

当然。您可以选择跳过失败的测试或直接忽略它们。

为此,您需要一个实现 IMethodInterceptor 的类。

由于显而易见的原因,我无法粘贴我正在使用的任何代码,但请查看此处以获取有关如何使用 IMethodInterceptor 的示例:https://gist.github.com/krmahadevan/5028960

您没有在问题中提及,但如果您使用的是 Jenkins,那么您可以将参数传递给构建,然后可用于过滤您尝试跳过/忽略的测试。

【讨论】:

不幸的是,IMethodInterceptor 不合适,因为它要求您事先知道什么会失败。在线执行测试的一个关键部分是从现有的实际生产数据中查询测试数据。因此,在测试实例运行之前,我们无法知道它是否会发生数据失败(数据相关失败),这并不表示测试失败,而只是无法使用测试解决的数据正确运行测试。【参考方案3】:

使用 try-catch 处理测试类中可接受的异常。如果您捕获了异常并且没有任何失败的断言,则测试将通过。

【讨论】:

我正在寻找通过/失败的第三条路线,这让我注意到它没有按预期运行,但没有显示为失败;我认为你的建议可能是我唯一的选择

以上是关于不是失败的TestNG失败的主要内容,如果未能解决你的问题,请参考以下文章

TestNG配置失败

在黄瓜 java+testng 中自动重新运行失败的唯一场景

将屏幕截图附加到 TestNG 失败的方法结果

如何在 testNG 报告中包含失败屏幕截图

当 @BeforeTest 方法失败时,为啥它没有在 testng-failed.xml 中列出?

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