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 에서 찾을 수 있습니다 .