Answers:
好的,我刚刚注意到一个模式,认为我已经弄清楚了(如果我错了,请纠正我)。在我看来,失败是指您的测试用例失败时,即您的断言不正确。错误是尝试实际运行测试时发生的意外错误-异常等。
@Test
使用expected = SomeException.class
。
如果您的测试引发了一个异常,而该异常没有通过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将其简化为仅故障。
以下链接提供了更多有趣的输入:
来自“使用JUnit的Java 8中的实用单元测试”:
JUnit中的断言(或断言)是您放入测试的静态方法调用。每个断言都是验证某些条件成立的机会。如果断言的条件不成立,则测试将在此处停止,并且JUnit报告测试失败。
(也有可能,当JUnit运行您的测试时,会引发而不捕获异常。在这种情况下,JUnit报告一个测试错误。)
我评论了抛出测试错误和测试失败的行。
@Test
public void testErrorVsTestFailure() {
final String sampleString = null;
assertEquals('j', sampleString.charAt(0) );
//above line throws test error as you are trying to access charAt() method on null reference
assertEquals(sampleString, "jacob");
//above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
}
因此,每当您遇到异常时,Junit就会显示测试错误,而当您的预期结果值与实际值不匹配时,它将显示测试失败。
源类: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)都计为失败。
没错,失败是由JUnit断言方法引发的AssertionErrors引发的,或者是引发AssertionError引发的,还是引发了您在 @Test
批注中,而错误来自其他意外的Exceptions。但是它们之间有一个重要的区别:
失败表示您的测试正确运行,并标识了代码中的缺陷。
错误可能意味着您的代码中存在错误,但您甚至没有测试过。这也可能意味着该错误在测试本身中。
简而言之,失败意味着您需要重写正在测试的代码。错误意味着您可能需要重写单元测试。即使失败发生在您的代码中(例如),也可能表示此问题NullPointerException
,因为您检测到甚至没有测试的缺陷,因此进行测试可能是明智的。
基本上,故障是指未实现的断言,而错误是由于异常的测试执行引起的。而且我认为每个IDE的通过,失败和错误测试都有不同颜色的符号图标。
有关更多信息,请检查此。
java.lang.AssertionError
抛出任何扩展,它将显示为测试失败而不是测试错误。您应该考虑接受自己的答案,因为它是正确的。