我正在大型代码库上运行JUnit测试,我一直意识到有时候我会得到“错误”,而有时候我会得到“失败”。有什么区别?
答案 0 :(得分:108)
好的,我刚刚注意到一种模式,并认为我已经弄明白了(如果我错了,请纠正我)。在我看来,失败是你的测试用例失败的时候 - 即你的断言不正确。错误是在尝试实际运行测试时发生的意外错误 - 例外等。
答案 1 :(得分:13)
如果您的测试抛出了一个异常,该异常不会通过Junit中的Assertion框架冒出来,则会将其报告为错误。例如,NullPointer或ClassNotFound异常将报告错误:
String s = null;
s.trim();
,或者
try {
// your code
} catch(Exception e) {
// log the exception
throw new MyException(e);
}
话虽如此,以下内容将报告失败:
Assert.fail("Failure here");
,或者
Assert.assertEquals(1, 2);
甚至:
throw new AssertionException(e);
这取决于您使用的Junit版本。 Junit 4-将区分失败和错误,但Junit 4仅将其简化为失败。
以下链接提供了更多有趣的输入:
答案 2 :(得分:5)
来自" Java 8中的实用单元测试与JUnit":
JUnit中的断言(或断言)是您插入的静态方法调用 你的考试。每个断言都是验证某些条件的机会 是的。如果断言条件不成立,则测试停止 在那里,JUnit报告测试失败。
(当JUnit运行测试时,也可能抛出异常并且 没被抓住在这种情况下,JUnit报告测试错误。)
答案 3 :(得分:4)
我已经注释了引发测试错误和测试失败的行。
spawn
因此Junit会在您收到异常时显示测试错误,并在您的预期结果值与实际值不匹配时测试失败
答案 4 :(得分:2)
源类:JUnitReportReporter.java
public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......
for (ITestResult tr : (Set) entry.getValue()) {
TestTag testTag = new TestTag();
boolean isSuccess = tr.getStatus() == 1;
if (!(isSuccess)) {
if (tr.getThrowable() instanceof AssertionError)
++errors;
else {
++failures;
}
}
}
正如您在上面的方法中看到的那样
tr.getThrowable()instanceof AssertionError
当它是AssertionError的实例时,错误计数会增加,否则(任何Throwable)会被计为失败。
答案 5 :(得分:0)
您是正确的,失败来自JUnit断言方法引发的AssertionErrors,或者引发AssertionError,或者引发您在@Test批注中声明的异常,并且错误来自其他意外异常。但是它们之间有一个重要的区别:
失败意味着您的测试正确运行,并确定了代码中的缺陷。
错误可能意味着您的代码中有错误,但您甚至没有测试过。这也可能意味着该错误位于测试本身中。
简而言之,失败意味着您需要重写正在测试的代码。错误意味着您可能需要重写单元测试。即使失败发生在您的代码中(例如NullPointerException),也可能意味着这一点,因为您检测到甚至没有测试的缺陷,因此进行测试可能是明智的。
答案 6 :(得分:0)
具有讽刺意味的是,junit和其他与测试相关的框架(testng,hamcrest)提供了断言操作,用于验证条件,如果条件失败,则将在后台“抛出” java.lang.AssertionError ,这是java.lang.Error的扩展。
但是,它与上面的答案当然完全矛盾。因此,为了将特定的测试流程标记为失败,可以抛出AssertionError,但是我不确定相应的手册中是否确实记录了该错误,因为更适合使用专用的fail()API。其他类型的Throwable将被视为错误,而不是失败。
答案 7 :(得分:0)
基本上,故障是指未实现的断言,而错误是由于异常的测试执行引起的。而且我认为每个IDE的通过,失败和有错误测试都具有不同颜色的符号图标。
有关更多信息,请检查this。
答案 8 :(得分:0)
测试方法抛出 | 测试结果 |
---|---|
java.lang.AssertionError | 失败 |
org.junit.AssumptionViolatedException | 跳过 |
预期的异常 | 好的 |
任何其他异常 | 错误 |
也不例外 | 好的 |
测试方法之外的异常 | 错误 |