들어가며
안녕하세요~! 오늘은 Junit 에서 테스트를 선별할 수 있는 기능에 대해 알아보도록 할게요.
특정 테스트들을 그룹핑하여 선별적으로 가동하기 위하여 자료를 알아보던 도중에 Junit Tag 라는 것을 알게 되었는데요
어떻게 하면 적용할 수 있을지 예제코드와 함께 알아볼게요
Junit Tag
예제에 사용되는 버젼은 Junit5 버젼을 예제로 합니다.
Junit Tag 는 class 혹은 method 단위로 지정하여, test 에게 일종의 태그를 붙여주는 역할을 합니다.
바로 예시와 함께 가보도록 할게요.
import org.assertj.core.api.WithAssertions
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
@Tags(
Tag("math"),
Tag("minus"),
)
class MinusTest : WithAssertions {
@Test
fun minus_test() {
// given
val number1 = 10
val number2 = 30
// when
val actual = number2 - number1
// then
assertThat(actual).isEqualTo(20)
println("[Test] minus executed")
}
}
MinusTest 라는 클래스를 만들고, Tag 를 math / minus 로 붙여보았어요.
그리고 실행되었는지를 알기 위해 println 을 추가하였어요.
import org.assertj.core.api.WithAssertions
import org.junit.jupiter.api.Tag
import org.junit.jupiter.api.Tags
import org.junit.jupiter.api.Test
@Tags(
Tag("math"),
Tag("plus"),
)
class PlusTest : WithAssertions {
@Test
fun plus_test() {
// given
val number1 = 10
val number2 = 30
// when
val actual = number1 + number2
// then
assertThat(actual).isEqualTo(40)
println("[Test] plus executed")
}
}
마찬가지로 PlusTest 라는 클래스를 만들고, Tag 를 math / plus 로 붙여보았어요.
그리고 실행되었는지를 알기 위해 println 을 추가하였어요.
각 Tag 를 기반으로 정말 원하는 테스트만 잘 가동되는지 확인이 필요한데요.
gradle script 에서 task 를 새롭게 만들어서 한번 정의해보도록 하겠습니다.
tasks.register<Test>("plusTest") {
useJUnitPlatform {
includeTags = setOf("plus")
}
}
tasks.register<Test>("minusTest") {
useJUnitPlatform {
includeTags = setOf("minus")
}
}
tasks.register<Test>("mathTest") {
useJUnitPlatform {
includeTags = setOf("math")
}
}
위와 같이 plusTest / minusTest / mathTest 라는 3종류의 task 를 만들었어요.
그러면 위와 같이 intellij 에서 test 들이 각각 생긴 것을 볼 수 있죠. 한번 각자 실행해볼까요?
원하는 대로 Tag 가 포함된 것만 실행된 것을 볼 수 있죠?
useJunitPlatform 에서 설정만 잘 추가하면 원하는 Tag 대로 실행하는 것이 가능하답니다.
물론 excludeTags 라는 기능도 존재해요. 해당 기능은 특정 Tag 만 테스트를 실행하지 않는 기능이에요.
Junit Tag Additional Function
조금 더 심화된 기능은 없는지 궁금하지 않나요.?
단순하게 사용하는 것외에 다양한 Tag Expressions 을 지원한답니다.
Operator | Meaning |
! | not |
& | and |
| | or |
조금 더 복잡한 조건이라면 Operator 를 추가적으로 얹어서 할 수 있죠
한번 예시를 추가적으로 만들어볼게요.
tasks.register<Test>("plusAndMinusTest") {
useJUnitPlatform {
includeTags = setOf("plus & minus")
}
}
tasks.register<Test>("plusOrMinusTest") {
useJUnitPlatform {
includeTags = setOf("plus | minus")
}
}
plusAndMinusTest 는 plus / minus Tag 가 둘다 선언된 클래스만 실행하게 되고,
plusOrMinusTest 는 plus 혹은 miuns 가 선언된 Tag 에 클래스만 실행하게 되요
한번 실행해볼까요?
plus and minus tag 가 모두 선언된 클래스는 없기에 실행 내역이 없고
plus, minus tag 가 하나라도 선언된 클래스는 있기에 모두 실행하게 되죠
정리하며
오늘은 테스트를 선별적으로 실행할 수 있는 기능에 대해 알아보았네요 ㅎㅎ
테스트를 그룹핑해서 실행하게 되는 경우 유용하게 쓸 수 있으니 기억해두었다가 사용하는 것도 좋겠네요~!
- junit tag 를 통해 테스트 클래스의 tag 를 붙여준다
- gradle task 를 통해 원하는 rule 에 따라 테스트가 실행되도록 정의한다
Reference
Junit5 - 2.9 Tagging and Filtering
Junit5 - 4.6.2 Tag Expressions
'Developer > Spring' 카테고리의 다른 글
[Gradle] Gradle multi module(project) with spring boot(feat. kotlin) (0) | 2024.09.30 |
---|---|
Spring Boot API server 성능 테스트(performance test)를 해보자(with python locust) (0) | 2024.02.12 |
[JPA] Hibernate 에서 지원하는 Id generator 에 대해 알아보자 (1) | 2023.12.17 |
Micrometer Tracing 에 대해 알아보자(a.k.a. spring cloud sleuth) (0) | 2023.10.28 |
Spring 에서 Transactional 을 사용할 때 Exception 이 발생하는 상황에 주의하자 (1) | 2023.06.11 |