JUnit中失败和错误的区别

2023/05/08

1. 概述

在本教程中,我们将探讨JUnit测试中失败(failure)和错误(error)之间的区别。

简而言之,失败是未实现的断言,而错误是由于异常的测试执行造成的。

2. 示例代码

让我们考虑一个非常简单的例子,即一个SimpleCalculator类,它有一个方法可以将两个double值相除:

public static double divideNumbers(double dividend, double divisor) {
    if (divisor == 0)
        throw new ArithmeticException("Division by zero!");
    return dividend / divisor;
}

请注意,对于double值,Java实际上并没有为除数为0抛出ArithmeticException-它返回Infinity或NaN

3. 失败示例

使用JUnit编写单元测试时,可能会出现测试失败的情况。一种可能性是我们的代码不符合其测试标准,这意味着一个或多个测试用例由于断言未得到满足而失败

在下面的示例中,断言将失败,因为除法的结果是2而不是15。我们的断言和实际结果根本不匹配:

@Test
@Disabled("test is expected to fail, disabled so that CI build still goes through")
void whenDivideNumbers_thenExpectWrongResult() {
    double result = SimpleCalculator.divideNumbers(6, 3);
    assertEquals(15, result);
}

4. 错误示例

另一种可能是我们在测试执行过程中遇到了意外情况,很可能是由于异常;例如,访问空对象将引发RuntimeException。

让我们看一个示例,其中测试将因错误而中止,因为我们试图除以0,我们通过在SimpleCalculator代码中抛出异常来明确防止这一点:

@Test
@Disabled("test is expected to raise an error, disabled so that CI still goes through")
void whenDivideByZero_thenThrowsException() {
    SimpleCalculator.divideNumbers(10, 0);
}

现在,我们可以通过简单地将异常作为我们的断言之一来修复此测试。

@Test
void whenDivideByZero_thenAssertException() {
    assertThrows(ArithmeticException.class, () -> SimpleCalculator.divideNumbers(10, 0));
}

然后,如果抛出异常,则测试通过,但如果没有,那将是失败。

5. 总结

JUnit测试中的失败和错误都表示不希望出现的情况,但它们的语义不同。失败意为无效的测试结果,而错误表示意外的测试执行

另外,请查看GitHub上的示例代码。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章