본문 바로가기
Study/테스트 주도 개발

[TDD] 스터디 2주차 (JUnit 관련 내용)

by Nahwasa 2023. 1. 9.

스터디 메인 페이지

 

* 책 내용의 1,2부는 책을 따라 실습하는 내용이므로 정리하는게 의미 없다고 판단되어 다른 스터디와 달리 책 내용은 정리하지 않습니다. 스터디에서 책 이외로 나온 내용만 정리했습니다.

 

 

IntelliJ 에서 JUnit 테스트는 Gradle로 실행하는 방법과 JUnit으로 실행하는 방법이 있다.

  • Gradle 사용 시 기본 실행은 Gradle로 실행된다.

  • JUnit으로 실행하려면 Edit Configurations 에서 설정을 추가해서 실행하면 된다.

  • 큰 차이는 없는데, Gradle로 실행 시엔 BUILD SUCCESSFUL 같은 그래들 메시지가 붙긴한다. 다만 그래들에서 설정할 수 있는 부분들이 있고, IDE 뿐 아니라 서버 환경에서도 동일하게 쓸 수 있으므로 그래들 쓸꺼면 그래들로 테스트하는게 나아보인다.

 

 

조건(환경)에 따라 테스트를 할 수도 있다. (github)

  • assumeTrue로 진행할지 말지 정하기
@Test
@DisplayName("JAVA_HOME 기준으로 JDK가 corretto-17.* 이어야만 수행한다.")
void conditional_test_java_home_is_corretto_17() {
    String javaHome = System.getenv("JAVA_HOME");
    assumeTrue(javaHome!=null && javaHome.contains("corretto-17"));

    Study study = new Study();
    assertNotNull(study);
}

 

  • assumingThat을 사용해 조건 주고 실행.
@Test
@DisplayName("JAVA_HOME 기준으로 JDK가 corretto-17.* 일 때와 아닐 때 다른 테스트를 수행한다.")
void conditional_test_java_home_is_corretto_17_or_not() {
    String javaHome = System.getenv("JAVA_HOME");
    Study study = new Study();
    boolean isCorretto17 = javaHome!=null && javaHome.contains("corretto-17");

    assumingThat(isCorretto17, () -> {
        assertTrue(study.getLimit() > 0, () -> "corretto-17이라면 스터디 참가 인원은 0 이상이어야 함.");
    });

    assumingThat(!isCorretto17, () -> {
        assertTrue(study.getLimit() > 2, () -> "corretto-17이라면 스터디 참가 인원은 2 이상이어야 함.");
    });
}

 

  • 어노테이션을 이용해 조건 주기
@Test
@EnabledIfEnvironmentVariable(named = "JAVA_HOME", matches = "^.*(corretto-17).*")  //matches는 정규표현식 가능
@DisplayName("어노테이션으로 환경변수를 판단해서 corretto-17 일 경우 수행한다.")
void conditional_test_java_home_is_corretto_17_with_anotation() {
    Study study = new Study();
    assertNotNull(study);
}

@Test
@DisabledOnJre(JRE.JAVA_8)
@DisplayName("자바 버전이 8이면 실행하지 않는다.")
void conditional_test_jupyter_jre_not_8_check() {
    Study study = new Study();
    assertNotNull(study);
}

@Test
@EnabledOnJre({JRE.JAVA_17, JRE.JAVA_19})
@EnabledOnOs({OS.MAC, OS.WINDOWS})
@DisplayName("자바 버전이 17 또는 19이고, OS가 MAC이나 WINDOWS면 실행한다.")
void conditional_test_jupyter_annotation() {
    Study study = new Study();
    assertNotNull(study);
}

 

 

Tag를 사용한 테스트 분기 (github)

  • @Test가 붙은 함수 혹은 테스트 클래스에 @Tag로 원하는 태그를 지정할 수 있음
@Tag("basic_test")
...
@Tag("conditional_test")

 

  • JUnit으로 실행 시엔 아래와 같이 태그 지정 가능

 

  • 그래들로 실행 시엔 아래와 같이 build.gradle에 설정해서 태그에 따라 실행되거나 안되게 할 수 있음.
...
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform {
        includeTags 'basic_test', 'conditional_test'
        excludeTags 'before_and_after'
    }
}

 

  • 위는 그래들로 그냥 실행 시 어떤 태그가 불릴지 설정하는 것이고, 아래처럼 추가로 task를 만들어서도 실행 가능. CI/CD 서버에서 돌리기 유용함.
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform {
        includeTags 'basic_test', 'conditional_test'
        excludeTags 'before_and_after'
    }
}

task basicTest(type: Test) {
    useJUnitPlatform {
        includeTags 'basic_test'
    }
}

task conditionalTest(type: Test) {
    useJUnitPlatform {
        includeTags 'conditional_test'
    }
}

 

  • 또한 어노테이션을 따로 커스텀해서 태그를 줘도 좋음. (github)
@Target(ElementType.TYPE) // 클래스, 인터페이스, 열거타입에 쓸 수 있다.
@Retention(RetentionPolicy.RUNTIME) // 런타임까지 남는다. (안사라진다)
@Nested
@DisplayName("생성시에 (항상 성공해야 하는 테스트들)")
@Tag("basic_test")
public @interface NestedBasicTest {   // 여러 어노테이션을 조합한 새로운 어노테이션
}

 

댓글