[Gradle] Multi Module에서 testFixtures를 이용하여 테스트 코드 중복 줄이기

조지헌
6 min readNov 30, 2022

--

이번에 멀티모듈로 프로젝트를 구성하면서 도메인도 각 도메인 별로 모듈로 나눠 작은 단위로 만들고 있습니다.

그러다보니 도메인 모듈에서 사용 될 공통 클래스가 당연히 존재(BaseTimeEntity 등) 했고 이를 해결 하기 위해 domain-common 이라는 모듈을 만들어 사용중이였습니다.

(회사도 위와 비슷하게 구성해 나가는 중)

여기서 문제는 프로덕트(main) 코드는 당연히 domain-common 모듈에 있는 것을 사용할 수 있지만, domain-common의 test에서 사용 된 클래스는 domain-member에서 사용할 수 없었습니다.

왜 의존성을 받아도 Test에서는 다른 모듈의 Test에서 사용된 클래스를 사용할 수 없는가?

각 모듈은 jar로 만들어지고 해당 jar를 다른 모듈에서 가져다 쓰는 것이기 때문에 빌드 된 jar에 test와 관련된 부분은 포함이 안되어 있기 때문에 사용할 수 없는 것입니다.

그렇다면 test는 중복된 클래스를 복붙해서 사용해야 하는가?

저는 이런 의문이 들어, 절대 그럴리 없다 생각하여 찾아본 결과 Gradle에서 이런 상황에 사용하라고 java-test-fixtures 플러그인을 제공하고 있었습니다.

플러그인 java-test-fixtures 추가

root build.gradle에서 아래와 같이 allproejcts에 java-test-fixtures 플러그인을 추가합니다.

  • build.gradle
...
allprojects {

apply plugin: "java-library"
apply plugin: boot
apply plugin: "io.spring.dependency-management"
apply plugin: "java-test-fixtures" // 추가

group "com.mimbers"
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'

repositories {
mavenCentral()
}
}
...

그러면 각 모듈에서 위 처럼 main, test외에 test-fixtures 모듈도 생성할 수 있게 됩니다.

공통으로 사용할 어노테이션 만들기

위 처럼 공통으로 사용할 어노테이션을 만들 수 있습니다.

testImplementation 'org.springframework.boot:spring-boot-starter-test'

그런데 보시다시피 위와 같은 의존성이 있어도 @DataJpaTest 어노테이션을 찾지 못하고 있습니다.

testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'

이는 Lombok을 테스트 코드에서 사용하려면 위 처럼 의존성을 추가해 주어야 하듯이 testFixtures에서 사용하려면 testFixturesImplementation로 따로 추가해주어야 하기 때문입니다.

testFixturesImplementation 'org.springframework.boot:spring-boot-starter-test'

위 처럼 추가해주면 정상적으로 @DataJpaTest 가 정상적으로 추가 됩니다.

다른 모듈에서 testFixtures 모듈 사용하기

implementation project(':mim-server-domain-common')

이렇게만 추가하면 testFixtures에서 작성된 클래스는 사용할 수 없습니다.

testImplementation testFixtures(project(':mim-server-domain-common'))

위 처럼 test에서 사용할 의존성이기 때문에 testImplementation으로 받고, testFixtures 모듈을 가져온다는 의미로 testFixtures안에 가져올 모듈을 작성하면 됩니다.

이제 테스트 코드에서도 다른 모듈의 클래스를 사용할 수 있습니다.

mim-server-domain-common 모듈의 build.gradle

mim-server-domain-member 모듈의 build.gradle

원리

java-test-fixtures 플러그인을 추가하면 아래와 같은 태스크가 추가됩니다.

이렇게 추가된 태스크가 끝나면 위 처럼 test-fixtures.jar가 생기고, 다른 모듈에서 해당 jar를 의존성 받아 사용하는 것 입니다.

단점

하나의 모듈에 대해 프로덕트 의존성과 testFixtures 의존성을 각각 받아야 하므로, 모듈이 많다면 이 또한 중복이 생길수 밖에 없습니다.

그렇지만 테스트 코드에서 공통으로 사용될 클래스를 줄일 수 있다면 그것이 더 큰 중복을 줄인 일이라 생각합니다.

--

--

조지헌

객체지향적인 설계와 클린 코드에 관심이 많으며, 테스트 자동화를 통해 견고한 애플리케이션을 만들기 위해 노력중입니다.