@TestNG在@DataProvider方法中引发异常后跳过测试。

14

我有点困惑。

我该如何让TestNG报告测试错误?

// ...
@DataProvider(name = "foo")
public Object[][] provideData () {
    throw new SomeRuntimeException("Some error occurred. The test configuration "
            + "is somehow incorrect.");
}

这只会导致测试被跳过。异常甚至没有被记录。 将其移至构造函数只会记录异常,但那还不够......

我希望能得到一个丰富的错误信息。

目前,使用专用(自己的)测试方法可以完成工作,它至少显示了一些测试失败......

无论如何,了解testNG的错误定义是件好事。

感谢任何提示!


你能展示一下调用这个的代码吗?你确定它没有被包裹在 try/catch 中吗? - Chris Thompson
与dataProvider相关的方法完全不知道任何异常。 - Doe Johnson
据我所了解,测试方法本身不会调用数据提供程序。测试方法将使用由数据提供程序提供的参数进行调用。 - Doe Johnson
DataProvider 是测试用例的前导部分,因此不会作为错误报告。你有责任在 DataProvider 方法中捕获和记录任何错误。 - Bob Dalgleish
太糟糕了。我想知道是否有可能直接触发错误。它不需要在DataProvider中完成。我的意思是,一般来说,有没有办法? - Doe Johnson
TestNG的DataProvider的行为真的很反直觉。我刚刚在这个问题上浪费了几个小时:我不明白为什么我的测试没有运行。然而,你的问题和Roman的答案让我找到了正确的方向:原来我的DataProvider中抛出了一个异常。感谢你们俩! - jub0bs
2个回答

13

这里是提出公平备选方案并详细解释的文章:

当TestNG的DataProvider抛出异常时,失败而不是跳过测试

对我来说,最好的方法是为数据提供程序添加测试,以下是该想法的简要说明:

public class MyClass {

    @DataProvider(name = "my-data-provider")
    private Object [][] myProvider() {
        // ...
    }

    @Test
    public void testDataProviders() {
        Assert.assertTrue(myProvider().length > 0);
    }

    @Test
    // ... Real tests.

}

3
这个问题比较陈旧,但在我看来问题仍然非常紧迫。非常感谢!这篇文章真的很有帮助。 - Doe Johnson

0

今天,TestNG 最新版本允许用户明确告知 TestNG 运行程序将 DataProvider 异常视为失败。

如果您正在以编程方式运行 TestNG,则可以这样做 -

TestNG tng = new TestNG();
tng.propagateDataProviderFailureAsTestFailure();

如果您正在传统方式下运行TestNG,您也可以在DataProvider注释上设置属性,如下所示 -

@DataProvider(name = "DataProviderName", propagateFailureAsTestFailure = true)
    public Object[][] dataProviderMethod(){
        return new Object[][]{{"row1-column1", "row1-column2"},
                {"row2-column1", "row2-column2"}};
    }

参考资料:

https://github.com/testng-team/testng/issues/217


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接