代码之家  ›  专栏  ›  技术社区  ›  froadie

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

  •  79
  • froadie  · 技术社区  · 14 年前

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

    5 回复  |  直到 6 年前
        1
  •  100
  •   froadie    14 年前

    好吧,我刚注意到一个模式,我想我已经弄明白了(如果我错了,请纠正我)。在我看来,失败是当测试用例失败时——也就是说,您的断言是不正确的。错误是在尝试实际运行测试异常等时发生的意外错误。

        2
  •  13
  •   Neel    12 年前

    如果您的测试抛出了一个异常,这个异常不会通过JUnit中的断言框架冒泡,那么它会被报告为一个错误。例如,空指针或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版本。JUnit4-将区分故障和错误,但JUnit4只将其简化为故障。

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

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

        3
  •  4
  •   Matias Elorriaga    8 年前

    从Java 8的语用单元测试与JUnit:

    JUnit中的断言(或断言)是您放入的静态方法调用 你的测试。每个断言都是一个机会来验证 成立。如果一个断言的条件不成立,测试就停止了。 在那里,JUnit报告了一个测试失败。

    (JUnit运行测试时,也可能引发异常,并且 没有被抓住。在本例中,JUnit报告一个测试错误。)

        4
  •  4
  •   Vombat    6 年前

    下面的测试解释了 测试错误与测试失败 .

    我已经对引发测试错误和测试失败的行进行了注释。

        @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在您得到异常时显示测试错误,在您期望的结果值与实际值不匹配时显示测试失败。

        5
  •  2
  •   Roushan    7 年前

    源类: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()断言器错误实例

    当它是断言错误的实例时,错误计数会增加,否则(任何可丢弃的)都会被计为失败。