JUnit中的失败和错误有什么区别?

时间:2010-08-06 17:00:20

标签: java testing junit

我正在大型代码库上运行JUnit测试,我一直意识到有时候我会得到“错误”,而有时候我会得到“失败”。有什么区别?

9 个答案:

答案 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仅将其简化为失败。

以下链接提供了更多有趣的输入:

http://www.devx.com/Java/Article/31983/1763/page/2

答案 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 跳过
预期的异常 好的
任何其他异常 错误
也不例外 好的
测试方法之外的异常 错误
  • assert 方法只是抛出 AssertionExceptions。
  • 在@Test 注释中声明了异常。
  • 测试方法之外的代码可以用@Before 注释, @BeforeClass 等等。
  • IDE 中的计数报告计数测试(测试方法),而不是断言,因为第一个失败的断言会终止测试。
  • 根据经验,如果测试方法异常终止(不是使用 return 语句),则不成功,反之亦然。