저는 대규모 코드 기반에서 JUnit 테스트를 실행하고 있으며, 가끔 "오류"가 발생하고 다른 경우에는 "실패"가 발생한다는 사실을 깨달았습니다. 차이점이 뭐야?
답변:
좋아, 나는 방금 패턴을 발견했고 그것을 알아 냈다고 생각한다 (내가 틀렸다면 나를 고쳐라). 실패는 테스트 케이스가 실패 할 때 발생하는 것 같습니다. 즉, 어설 션이 올바르지 않습니다. 오류는 실제로 테스트를 실행하는 동안 발생하는 예기치 않은 오류 (예외 등)입니다.
@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의 Pragmatic Unit Testing"에서 :
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
어노테이션 에서 선언 한 예외를 던짐으로써 발생 하고 오류는 다른 예기치 않은 예외에서 발생한다는 것이 맞습니다 . 그러나 그들 사이에는 중요한 차이점이 있습니다.
실패는 테스트가 올바르게 실행되었으며 코드에서 결함을 식별했음을 의미합니다.
오류는 코드의 버그를 의미 할 수 있지만 테스트하지 않은 버그입니다. 또한 버그가 테스트 자체에 있음을 의미 할 수도 있습니다.
간단히 말해, 실패는 테스트중인 코드를 다시 작성해야 함을 의미합니다. 오류는 다시 작성해야하는 단위 테스트 일 수 있음을 의미합니다. NullPointerException
테스트하지 않은 결함을 감지했기 때문에 오류가 코드에 있었더라도이를 의미 할 수 있으므로 테스트하는 것이 현명 할 수 있습니다.
아이러니하게도 junit 및 기타 테스트 관련 프레임 워크 (testng, hamcrest)는 조건을 확인하는 어설 션 작업을 제공하며, 실패하면 "내부에서"java.lang.AssertionError가 발생하고 btw는 java.lang.Error를 확장합니다.
그러나 그것은 물론 완전히 유효한 위의 답변과 모순되지 않습니다. 따라서 특정 테스트 흐름을 실패로 표시하기 위해 AssertionError를 던질 수 있지만 전용 fail () API를 사용하는 것이 더 적절하기 때문에 해당 설명서에 실제로 문서화되어 있는지 확실하지 않습니다. 다른 종류의 Throwable은 실패가 아닌 오류로 간주됩니다.
java.lang.AssertionError
이 발생하면 테스트 오류 대신 테스트 실패로 표시됩니다. 자신의 답변이 정확하기 때문에 받아들이는 것을 고려해야합니다.