【问题标题】:Should I use try-catch block with Assertions我应该使用带有断言的 try-catch 块吗
【发布时间】:2016-09-27 08:15:07
【问题描述】:

这个问题想了很久,我想知道我是否应该使用带有断言的try-catch Block? 例如-

1. assertEquals(actual, expected);
2. try
{
assertEquals(actual, expected);
}
catch(AssertionError e)
{
e.printStackTrace();
}

什么是好的做法? 1 还是 2? TIA

【问题讨论】:

  • 捕获异常有什么好处?你肯定希望测试失败...

标签: java unit-testing try-catch assertions


【解决方案1】:

不,您当然不应该这样做。断言的目的是当它失败时,它会抛出断言错误,以便通知测试单元引擎。

所以,简单地说,做断言。并让它工作:)。如果失败,你应该解决问题。

另一方面,如果您要测试的内容是否抛出异常。您可以通过多种方式做到这一点:

@Test(expected = NullPointerException.class)
public void myTestForException() {
    callMethodThatThrowsNullPointerException();
}

或者你可以使用 try/catch:

@Test
public void myTest() {
    try {
        fail("Should throw whatever");
    } catch (MyException e) {
        // Everything is fine, test passed
    }
}

【讨论】:

  • 有一个更好的测试异常被抛出的方法。使用 JUnit ExpectedException 规则。它们记录在 JUnit 网站上。
【解决方案2】:

使用 JUnit、TestNG 或类似的东西进行测试的全部意义在于,您可以在项目中进行数千个测试,并自动执行测试。运行测试可以是构建过程的一部分,并且您会得到一些关于有多少测试通过的反馈。当您的项目不仅包含少数几个类时,这绝对是必不可少的。

您关于捕获 assertEquals 抛出的错误并将其报告给控制台的想法不是一个好主意。主要是因为它在断言失败时使测试通过。这意味着无论您使用什么来运行测试(例如,Jenkins)都报告了错误的结果。例如,您会看到 5000 个测试中有 5000 个通过了,即使其中很多包含失败的断言。突然之间,你的大量测试就变得毫无价值了。

此外,您如此仔细打印的堆栈跟踪将会丢失,在所有各种测试的大量输出中。

所以简短的回答是您的想法 (1) 是正确的做法。这是每个人都在做的事情。这意味着您的测试结果得到了适当的报告。你永远不应该像你的想法那样编写测试 (2)。

【讨论】:

    猜你喜欢
    • 2020-02-11
    • 1970-01-01
    • 2019-03-24
    • 1970-01-01
    • 2016-01-23
    • 2017-05-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多