테스트를 작성하다 보니 한 가지 궁금한 점이 생겼습니다.
왜 어떤 테스트는 Run으로 실행하고, Docker 테스트는 ./gradlew dockerTest로 실행할까?
일반적인 단위 테스트나 통합 테스트는 IntelliJ에서 테스트 옆의 ▶(run) 버튼을 눌러 바로 실행할 수 있었습니다.
그런데 Docker를 사용하는 테스트는 프로젝트에서 다음 명령어로 실행하고 있었습니다.
./gradlew dockerTest
처음에는 "Docker 테스트라서 무조건 터미널에서 실행해야 하나?" 라고 생각했는데, 정확히는 Docker 때문이라기보다 Gradle에서 테스트를 어떻게 구분해 놓았는지와 관련이 있었습니다.
JUnit으로 작성한 테스트에는 IntelliJ에서 ▶ 버튼이 표시됩니다.
예를 들어 다음과 같은 테스트가 있다면,
@Test
void getPost() {
// ...
}
옆의 Run 버튼을 누르는 것만으로 해당 테스트를 바로 실행할 수 있습니다.
이 방법은 특정 테스트 하나를 빠르게 확인할 때 편리합니다.
즉,
지금 작성한 이 테스트 하나가 제대로 동작하는지 확인하고 싶다.
와 같은 상황에서 사용하기 좋습니다.
./gradlew test 는 무엇이 다를까?
터미널에서 다음 명령을 실행할 수도 있습니다.
./gradlew test
이 경우에는 IntelliJ가 직접 테스트를 선택해서 실행하는 것이 아니라, Gradle의 test Task가 실행됩니다.
Gradle에 설정되어 있는 규칙에 따라 여러 테스트를 한 번에 실행하게 됩니다.
예를 들어 프로젝트에서 다음과 같이 Docker 테스트에 태그를 붙였다고 가정하겠습니다.
@Tag("docker")
class CommunityFlowDockerTest {
}
그리고 Gradle에서 일반 test 실행 시 docker 태그를 제외했다면,
test {
useJUnitPlatform {
excludeTags "docker"
}
}
다음 명령은 Docker 테스트를 제외한 일반 테스트들만 실행합니다.
./gradlew test
그렇다면 dockerTest는 무엇일까?
dockerTest는 JUnit이 기본적으로 제공하는 명령어가 아닙니다.
프로젝트에서 Docker 관련 테스트만 따로 실행하기 위해 만든 Gradle Task입니다.
예를 들어 다음과 비슷하게 설정할 수 있습니다.
tasks.register('dockerTest', Test) {
useJUnitPlatform {
includeTags 'docker'
}
}
이렇게 설정하면
./gradlew dockerTest
를 실행했을 때 @Tag("docker")가 붙은 테스트만 골라서 실행할 수 있습니다.
즉, 중요한 차이는 다음과 같습니다.
| 실행 방법 | 의미 |
| IntelliJ ▶ Run | 내가 선택한 파일 / 메서드 1개 |
| ./gradlew test | 프로젝트 내 모든 일반 테스트 |
| ./gradlew dockerTest | 도커가 필요한 특수 통합 테스트 |
Docker 테스트는 왜 따로 분리할까?
Docker 테스트는 보통 Testcontainers를 사용해 MySQL이나 Redis 같은 실제 환경에 가까운 컨테이너를 실행합니다.
예를 들어 단위 테스트는 단순히 Mock 객체만 사용하기 때문에 비교적 빠르게 끝납니다.
반면 Docker 테스트는 다음과 같은 과정이 추가될 수 있습니다.
| ↓ | 테스트 실행 |
| Docker 컨테이너 생성 | |
| MySQL / Redis 실행 | |
| Spring Boot 애플리케이션과 연결 | |
| 테스트 수행 | |
| 컨테이너 종료 |
따라서 모든 테스트를 실행할 때마다 Docker 테스트까지 함께 실행하면 시간이 더 오래 걸릴 수 있습니다.
그래서 저는 테스트를 다음처럼 구분했습니다.
- ./gradlew test
- 빠르게 실행할 수 있는 일반 테스트
- ./gradlew dockerTest
- 실제 MySQL, Redis 환경까지 확인하는 Docker 테스트
이렇게 분리하면 평소 개발 중에는 빠른 테스트를 자주 실행하고, 실제 인프라까지 포함해서 확인할 필요가 있을 때만 Docker 테스트를 실행할 수 있습니다.
그럼 Docker 테스트는 Run 버튼으로 실행하면 안 될까?
결론부터 말씀드리자면 반드시 그렇지만은 않습니다.
Docker 테스트도 JUnit 테스트이기 때문에 IntelliJ의 Run 버튼으로 실행할 수 있는 경우가 많습니다.
다만 Run 버튼으로 직접 실행하면 Gradle에서 dockerTest Task에 설정해 둔 규칙을 그대로 거치지 않을 수 있습니다.
반면,
./gradlew dockerTest
를 사용하면 프로젝트에서 정의한 Docker 테스트 실행 규칙대로 실행된다는 점이 분명합니다.
또한 나중에 CI 환경에서도 IntelliJ의 Run 버튼을 사용할 수는 없기 때문에,
./gradlew test
./gradlew dockerTest
와 같이 Gradle 명령으로 테스트 실행 방법을 정해두는 것이 일관된 테스트 환경을 만드는 데 도움이 됩니다.
처음에는 일반 테스트는 Run 버튼, Docker 테스트는 터미널에서 실행해야 하는 서로 다른 종류의 테스트라고 생각했습니다.
하지만 정리해보니 핵심은 Docker 사용 여부 자체가 아니라 Gradle Task의 구분이었습니다.
@Tag("docker")를 이용해 무거운 테스트를 따로 분리하고,
./gradlew test
와
./gradlew dockerTest
로 실행 목적을 나누면 개발 중에는 빠르게 테스트하면서도 필요할 때 실제 MySQL, Redis 환경까지 검증할 수 있습니다.
테스트를 작성하는 것뿐만 아니라 어떤 테스트를 언제 실행할 것인지도 프로젝트의 테스트 전략 중 하나라는 점을 알게 되었습니다.
'Java > Spring Boot' 카테고리의 다른 글
| Spring Security와 JWT, 구현하며 이해한 인증 구조 (0) | 2026.09.24 |
|---|---|
| AWS(Amazon Web Service), 클라우드와 AWS 주요 서비스 기초 정리 (0) | 2026.09.19 |
| JUnit5, Mockito, AssertJ (4) | 2026.09.17 |
| 테스트 종류와 테스트 도구 정리 (0) | 2026.09.17 |
| [JPA 조회 최적화] FetchType.LAZY, N+1, Fetch Join, DTO Projection 이해하기 (0) | 2026.09.15 |