JUnit5 태그 필터링 - @Tag

테스트 태그를 달아서 태그를 설정한 테스트만 실행하는 방법에 대해서 설명

태그 필터링

테스트에 @Tag를 지정하여, 입력한 Tag명에 따라, 테스트는 실행할 수 있는 기능에 대해서 알아보겠다.

태그 지정

@Tag는 테스트 클래스 또는 메소드에 추가하여 테스트 케이스에 태그를 지정할 수 있다.

package com.devkuma.junit5.tag;

import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;

public class TagTest {

    @Test
    @Tag("tag1")
    @Tag("tag3")
    void test1() {
        System.out.println("test1@(tag1, tag3)");
    }

    @Test
    @Tag("tag2")
    @Tag("tag3")
    void test2() {
        System.out.println("test2@(tag2, tag3)");
    }

    @Test
    @Tag("tag3")
    void test3() {
        System.out.println("test3@(tag3)");
    }

    @Test
    @Tag("tag4")
    void test4() {
        System.out.println("test4@(tag4)");
    }
}

위에 테스트 코드에서는 아래와 같이 태그를 지정하였다.

test1() test2() test3() test4()
tag1 O
tag2 O
tag3 O O O
tag4 O

ConsoleLauncher에서 실행

ConsoleLauncher은 CLI 옵션으로 --include-tag를 조건으로 일치하거나 일치하지 않는 태크만 타겟킹할 수 있다.

일반적으로 테스트를 실행해 보면, 모든 테스트가 실행이 된다.

$ java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter

실행 결과:

test1@(tag1, tag3)
test3@(tag3)
test4@(tag4)
test2@(tag2, tag3)

--include-tag 옵션을 넣고 실행시켜 보면, 해당 Tag의 테스트만 실행된다.

Tag가 "tag3"인 경우만 실행한다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "tag3"

실행 결과:

test1@(tag1, tag3)
test3@(tag3)
test2@(tag2, tag3)

Tag가 "tag1"이고, "tag3"인 경우만 실행한다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "tag1 & tag3"

실행 결과:

test1@(tag1, tag3)

Tag가 "tag1"이거나, "tag3"인 경우만 실행한다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "tag1 | tag2"

실행 결과:

test1@(tag1, tag3)
test2@(tag2, tag3)

Tag가 "tag1"이 아니고 "tag3"인 경우만 실행한다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "\!tag1 & tag3"

실행 결과:

test3@(tag3)
test2@(tag2, tag3)

Tag가 "tag1"이거나, "tag3"이 아닌 경우만 실행한다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "tag1 | \!tag3"

실행 결과:

test1@(tag1, tag3)
test4@(tag4)

Tag가 괄호()로 조건을 정리하는 것도 가능하다.

% java -jar junit-platform-console-standalone-1.9.1.jar \
    -cp build/classes/java/test \
    --select-class com.devkuma.junit5.tag.TagTest \
    -e junit-jupiter \
    --include-tag "(\!tag1 & tag3) | tag4"

실행 결과:

test2@(tag2, tag3)
test3@(tag3)
test4@(tag4)
  • 태그 이름에 지정하는 문자열은 다음 조건을 충족해야 한다.
    • null 또는 빈 문자가 아니어야 한다.
    • 공백 문자를 포함하지 않는다.
    • 제어 문자를 포함하지 않는다.
    • 다음 예약된 문자를 포함하지 않는다.
      • (, ), ,, &, |, !
  • 태그는 런타임에 지정한 조건으로 필터링할 수 있다.

빌드 실행

Gradle에서 실행하는 경우는 다음과 같은 느낌으로 지정한다.

build.gradle

// ...
test {
    useJUnitPlatform {
        includeTags "tag1 | !tag3"
    }
}
  • includeTags 또는 excludeTags 로 지정할 수 있다.
  • 태그를 좁히는 조건은 전용 태그식 으로 기술할 수 있다.
  • 태그 표현식에서는 연산자를 사용하여 복잡한 조건을 작성할 수 있다.
    • !: 아니다
    • & : 그리고
    • |: 또는

IntelliJ IDEA 실행

IntelliJ IDEA에서 Tag를 실행을 하려면 먼저, JUnit 실행 항목을 만들어야 한다.

먼저, 실행 구성 수정 버튼을 누른다.
JUnit 인테리제이 실행

“Run/Debug Configurations” 팝업이 표시되면, 추가 버튼(+)를 누르고 “JUnit” 항목을 선택한다.
JUnit 인테리제이 실행

Name를 입력하고, Tags 선택하고, 태크명을 지정한다.
JUnit 인테리제이 실행

그러고, 실행을 해보면, 지정한 태그명("tag3")인 테스트만 실행된 것을 확인 할 수 있다.
JUnit 인테리제이 실행




최종 수정 : 2022-12-15