我正在为我们的主要产品编写单元测试,并且有一个问题:如何区分
- 因测试出错而失败的测试(例如,发现了一个错误,并且它是一个非回归测试)
- 由于测试的另一个意外部分失败而失败的测试(因为测试错误或出现未知错误)
对于第一个,我们肯定有 jUnit Assert 框架,但是对于第二个,我们有什么?
示例:我的单元测试是测试 c() 不会抛出 MyException,但要执行 c(),我需要先执行 a(),然后执行 b(),两者都可以抛出 MyException(),所以我会写:
@Test
public void testC() {
a();
Object forC = b();
try {
c(forC);
} catch (MyException e) {
Assert.fail("....");
}
}
但是接下来我需要处理可以由 a 或 b 抛出的 MyException,并且还要处理 forC 不应该为 null 的事实。做这个的最好方式是什么?
- 捕获由 a 或 b 和 Assert.fail 引发的 MyException,但 a 和 b 未通过此测试进行测试,因此对我而言,当它们失败时不应将它们标记为测试失败。也许他们稍后会失败,因为此时我们应该做 b();a() 而不是 a();b();。
- 让 testC 抛出 MyException,这样测试将因“MyException”而失败,但这是误导性的,因为 MyException 不会告诉测试写错了。然后,所有测试都会因各自的异常而失败。在这种情况下,如果 forC 为 null,我还需要抛出类似 NullPointerException 的东西,这也没有语义。
- 捕获 a 和 b 抛出的 MyException 并将其包装到一个异常中,该异常表明测试可能是错误的,例如 TestCorruptedException。但是我在 jUnit 中找不到这样的异常,所以 jUnit 不会识别它们(这对我来说没问题)。此外,我需要从我的所有单元测试中知道这个异常,这些单元测试当然被分成多个模块、项目等......所以这是可行的,但会增加依赖项。
您对这个问题的解决方案是什么?我可能会选择第二个,但如上所述,我对它不满意。