Spring

JUnit 4에서 조건부로 테스트 실행 또는 무시

기록만이살길 2021. 9. 11. 02:30
반응형

1. 개요

운영 체제에 의존하고 테스트 시스템이 Linux에서 실행되는 경우에만 실행되어야 하는 일부 코드에 대한 테스트가 있다고 가정해 보겠습니다. 다른 OS에서 실행 중인 경우 테스트가 실패하지 않고 런타임에 무시되기를 원합니다.

첫 번째 접근 방식은 몇 가지 if 문을 사용하여 시스템 클래스 속성을 사용하여 이 조건을 확인하는 것입니다 . 이것은 물론 작동하지만 JUnit에는 더 깨끗하고 우아한 방법이 있습니다.

이 짧은 예제에서는 Assume 클래스를 사용하여 JUnit 4 에서 테스트를 조건부로 실행하거나 무시하는 방법  을 살펴볼 것 입니다.

2. 가정 클래스

이 클래스는 특정 조건에 기반한 조건부 테스트 실행을 지원하는 메서드 집합을 제공합니다 . 이 모든 조건이 충족되는 경우에만 테스트가 실행됩니다. 그렇지 않은 경우 JUnit은 실행을 건너뛰고 테스트 보고서에서 통과된 것으로 표시합니다 . 후자는 Assert 클래스 와의 주요 차이점으로, 조건이 실패하면 테스트가 실패 로 종료됩니다 .

주목해야 할 중요한 점 Assume 클래스에 대해 설명한 동작 이 기본 JUnit 러너에만 적용된다는 것 입니다. 으로 지정 주자 상황이 다를 수 있습니다.

마지막으로 Assert 와 같은 방식으로 @Before 또는  @BeforeClass 어노테이션이 달린 메서드 또는 @Test  메서드 자체 에서 Assume 메서드를 호출할 수 있습니다.

이제 몇 가지 예를 보여줌으로써 Assume 클래스 의 가장 유용한 메서드를 살펴보겠습니다 . 다음 모든 예에서 getOsName()Linux를 반환 한다고 가정해 보겠습니다 .

2.1. 가정하기 사용 하기

assumeThat () 이 경우, - 상태가 검사 방법 getOsName () - 만족가 정규의 상태로 전달

@Test
public void whenAssumeThatAndOSIsLinux_thenRunTest() {
    assumeThat(getOsName(), is("Linux"));

    assertEquals("run", "RUN".toLowerCase());
}

이 예에서 우리는 여부를 확인 getOsName은 () 에 동일 리눅스 . 으로 getOsName ()가 반환 리눅스 , 테스트가 실행됩니다 . 여기서 우리는 Hamcrest matcher 메소드 is(T) 를 matcher로 사용하고 있습니다.

2.2. assertTrue 사용

유사하게, 우리는  테스트를 실행하기 위해 true 평가되어야 하는 부울 표현식을 지정 하기 위해 assertTrue() 메소드를  사용할 수 있습니다  . false 로 평가  되면 테스트가 무시됩니다.

private boolean isExpectedOS(String osName) {
    return "Linux".equals(osName);
}

@Test 
public void whenAssumeTrueAndOSIsLinux_thenRunTest() {
    assumeTrue(isExpectedOS(getOsName()));
 
    assertEquals("run", "RUN".toLowerCase());
}

이 경우 isExpectedOs()true 를 반환 합니다 . 따라서, 실행에 테스트를위한 조건이 충족되었고, 테스트가 실행됩니다 .

2.3. 가정 거짓 사용

마지막으로, 테스트를 실행하기 위해 false 평가되어야 하는 부울 표현식을 지정 하기 위해 반대 가정False() 메소드를 사용할 수 있습니다 . true 로 평가  되면 테스트가 무시됩니다.

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assumeFalse(isExpectedOS(getOsName()));

    assertEquals("run", "RUN".toLowerCase());
}

이 경우, 같은 isExpectedOs () 반환 사실  실행에 테스트를위한 조건이 충족되지 않은, 시험은 무시됩니다 .

2.4. 가정하지 않는 널 사용

어떤 표현식이 null인 경우 테스트를 무시하고 싶을 때 assertNotNull() 메서드를 사용할 수 있습니다 .

@Test
public void whenAssumeNotNullAndNotNullOSVersion_thenRun() {
    assumeNotNull(getOsName());

    assertEquals("run", "RUN".toLowerCase());
}

으로 getOsName () null 이외의 값을 반환, 실행할 수있는 테스트 조건이 충족되었으며 테스트가 실행됩니다.

2.5. 가정하지 않는 예외 사용

마지막으로 예외가 발생하면 테스트를 무시할 수 있습니다. 우리는 이 목적을 위해 assertNoException()사용할 수 있습니다 :

@Test
public void whenAssumeNoExceptionAndExceptionThrown_thenIgnore() {
    assertEquals("everything ok", "EVERYTHING OK".toLowerCase());
    String t=null;
    try {
        t.charAt(0);
    } catch(NullPointerException npe){
        assumeNoException(npe);
    }
    assertEquals("run", "RUN".toLowerCase());
}

이 예에서, t는 이다 널 (null), NullPointerException이의 예외 때문에 발생합니다 실행에 시험이 충족되지 않은 조건을, 시험은 무시됩니다 .

3. 가정된 XXX 호출을 어디에 넣어야 합니까?

그것은 것이 중요의 의 행동 assumeXXX의 방법은 우리가 우리의 테스트에 넣어 위치에 따라 달라집니다 .

assertEquals() 호출이 먼저 실행 되도록 가정한 예제를 약간 수정해 보겠습니다 . 또한 assertEquals()가 실패 하도록 합시다 .

@Test
public void whenAssumeFalseAndOSIsLinux_thenIgnore() {
    assertEquals("run", "RUN");
    assumeFalse(isExpectedOS(getOsName()));
}

이 예제를 실행하면 다음을 갖게 됩니다.

org.junit.ComparisonFailure: 
Expected :run
Actual   :RUN

이 경우, 우리의 테스트는 우리가 가정하는 것에 도달하기 전에 실패했기 때문에 무시되지 않습니다 . 모든 assertXXX 메서드 에서도 마찬가지 입니다. 따라서 우리는 테스트 메소드 내부의 올바른 위치에 배치해야 합니다 .

4. 결론

이 짧은 예제 에서 JUnit 4 Assume 클래스를 사용하여 테스트 실행 여부를 조건부로 결정할 수 있는 방법을 살펴보았습니다. JUnit 5를 사용하는 경우 버전 5.4 이상에서도 사용할 수 있습니다 .

항상 그렇듯이 우리가 겪은 예제의 소스 코드는 GitHub 에서 찾을 수 있습니다 .

Junit footer banner
참고
  • https://docs.spring.io/spring-framework/docs/current/reference/html
  • https://www.baeldung.com/junit-conditional-assume

반응형