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