* 책 내용의 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 { // 여러 어노테이션을 조합한 새로운 어노테이션
}
'Study > 테스트 주도 개발' 카테고리의 다른 글
TDD, Mock, SOLID 얘기 - 도시 가스 요금 계산 (0) | 2023.01.29 |
---|---|
[TDD] 스터디 4주차 (25~28장 정리) (0) | 2023.01.20 |
[TDD] 스터디 3주차 (테스트 반복, 순서 지정, Extension 관련) (0) | 2023.01.10 |
[TDD] 스터디 1주차 (기본적인 테스트 방법, 1~2장 정리) (0) | 2022.12.18 |
댓글