JUnit의 실패와 오류의 차이점은 무엇입니까?


93

저는 대규모 코드 기반에서 JUnit 테스트를 실행하고 있으며, 가끔 "오류"가 발생하고 다른 경우에는 "실패"가 발생한다는 사실을 깨달았습니다. 차이점이 뭐야?

답변:


116

좋아, 나는 방금 패턴을 발견했고 그것을 알아 냈다고 생각한다 (내가 틀렸다면 나를 고쳐라). 실패는 테스트 케이스가 실패 할 때 발생하는 것 같습니다. 즉, 어설 션이 올바르지 않습니다. 오류는 실제로 테스트를 실행하는 동안 발생하는 예기치 않은 오류 (예외 등)입니다.


5
확장 java.lang.AssertionError이 발생하면 테스트 오류 대신 테스트 실패로 표시됩니다. 자신의 답변이 정확하기 때문에 받아들이는 것을 고려해야합니다.
ponzao

예, 그게 바로 차이입니다. 실용적인 관점에서 보면 "차이가 없습니다". 오류나 실패가 발생하면 수정해야한다는 점입니다. 따라서 JUnit에서 "실패"와 "오류"를 별도로 계산하는 것은 실수 였을 것입니다. JUnit 4는 두 가지를 결합합니다 (아래 답변에서 설명).
Jeff Grigg 2013 년

예외가 예상되는 경우, 당신은을 주석해야 @Test와 함께 expected = SomeException.class.
Downhillski

@JeffGrigg 실용적인 차이가 있습니다. 여러 테스트 케이스에서 하나의 동작이 의존하는 경우, 나머지는 모두 잡히지 않은 런타임 예외를 던지면서 해당 동작을 주장하는 테스트 케이스 하나만 작성할 수 있습니다. 이는 나머지 테스트 케이스가 실행하기 위해 특정 동작에 여전히 의존하고 있음에도 불구하고 다른 것을 테스트하고 있음을 의미합니다. 해당 동작이 깨지면 하나의 테스트 케이스 만 실패를보고하고 나머지는 오류를보고하며, 이로부터 많은 테스트 케이스가 통과하지 못했지만 정확히 하나의 버그를 수정해야 함을 알 수 있습니다.
RonJRH

org.junit.Assert.assertEquals () 실패하면 JUnit4 HTML 보고서에서 ERROR로 간주됩니다. 이것은 (지금까지 내가 알고 있었던) 당신의 진술과 모순됩니다. 이것에 더 많은 빛을 주시겠습니까?
Krishnom

15

테스트에서 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


이것은 정확하지 않습니다. 테스트 실패와 테스트 오류의 구분은 JUnit 4에서 사라지지 않았습니다. 방금 테스트했습니다. 링크 된 기사는 오해의 소지가 있습니다. "JUnit 4는 실패만을 사용하여 더 간단하게 만든다"라고 말했지만 JUnit 4는 java.lang.AssertionError를 테스트 실패로 전환하므로 junit.framework.AssertionFailedError를 사용할 필요가 없다는 점을 강조해야합니다. 이점은 프로젝트를 JUnit에 연결하지 않고도 프로덕션 코드에서 테스트 어설 션 작성을 시작할 수 있다는 것입니다. 테스트 오류와 테스트 실패를 구분하는 것도 매우 유용하며 제거하면 뒤로 물러날 것입니다.
RonJRH

RonJRH, 기본 junit 보고서에서 오류를 볼 수 있습니까?
Neel

네 Neel. 방금 시도했습니다. 여기에 이미지를 연결하는 방법은 확실하지 않지만 테스트 결과를 보여줍니다. imagebucket.net/abpxucddkvn1/Capture.PNG
RonJRH

6

"JUnit을 사용한 Java 8의 Pragmatic Unit Testing"에서 :

JUnit의 어설 션 (또는 어설 션)은 테스트에 드롭하는 정적 메서드 호출입니다. 각 주장은 어떤 조건이 참인지 확인할 수있는 기회입니다. 어설 션 된 조건이 참이 아니면 테스트가 바로 중지되고 JUnit이 테스트 실패를보고합니다.

(JUnit이 테스트를 실행할 때 예외가 발생하고 포착되지 않을 수도 있습니다.이 경우 JUnit은 테스트 오류를보고합니다.)


5

아래 테스트는 테스트 오류와 테스트 실패 의 차이점을 설명합니다 .

테스트 오류와 테스트 실패를 던지는 줄에 대해 설명했습니다.

    @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은 예외가 발생할 때마다 테스트 오류를 ​​표시하고 예상 결과 값이 실제 값과 일치하지 않으면 테스트 실패를 표시합니다.


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) 실패로 간주됩니다.


1

실패는 JUnit 어설 션 메소드가 던진 AssertionErrors에서 발생하거나 AssertionError를 던지거나 @Test어노테이션 에서 선언 한 예외를 던짐으로써 발생 하고 오류는 다른 예기치 않은 예외에서 발생한다는 것이 맞습니다 . 그러나 그들 사이에는 중요한 차이점이 있습니다.

실패는 테스트가 올바르게 실행되었으며 코드에서 결함을 식별했음을 의미합니다.

오류는 코드의 버그를 의미 할 수 있지만 테스트하지 않은 버그입니다. 또한 버그가 테스트 자체에 있음을 의미 할 수도 있습니다.

간단히 말해, 실패는 테스트중인 코드를 다시 작성해야 함을 의미합니다. 오류는 다시 작성해야하는 단위 테스트 일 수 있음을 의미합니다. NullPointerException테스트하지 않은 결함을 감지했기 때문에 오류가 코드에 있었더라도이를 의미 할 수 있으므로 테스트하는 것이 현명 할 수 있습니다.


0

아이러니하게도 junit 및 기타 테스트 관련 프레임 워크 (testng, hamcrest)는 조건을 확인하는 어설 션 작업을 제공하며, 실패하면 "내부에서"java.lang.AssertionError가 발생하고 btw는 java.lang.Error를 확장합니다.

그러나 그것은 물론 완전히 유효한 위의 답변과 모순되지 않습니다. 따라서 특정 테스트 흐름을 실패로 표시하기 위해 AssertionError를 던질 수 있지만 전용 fail () API를 사용하는 것이 더 적절하기 때문에 해당 설명서에 실제로 문서화되어 있는지 확실하지 않습니다. 다른 종류의 Throwable은 실패가 아닌 오류로 간주됩니다.


0

기본적으로 오류는 비정상적인 테스트 실행으로 인한 오류 인 동안 충족되지 않은 어설 션 을 의미 합니다 . 그리고 각 IDE에는 pass , failed오류 테스트에 대해 서로 다른 색상의 기호 아이콘이 있다고 생각 합니다.

자세한 내용은이를 확인 하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.