kyucumber
전체 글 보기

Gradle test fixtures 플러그인을 통해 중복 코드 줄이기

아래와 같은 멀티모듈 구조를 가진 프로젝트에서 module-library에 포함된 User라는 클래스와 연관된 테스트를 각각의 모듈에서 작성한다고 할 때 어떤 문제점이 있을까요?

├── module-one │ └── module-library │ └── test │ └── OneUserTest ├── module-two │ └── module-library │ └── test │ └── TwoUserTest ├── module-three │ └── module-library │ └── test │ └── ThreeUserTest └── module-library └── src └── User

실제 코드를 작성할 때는 별 다른 문제가 없지만 테스트를 작성할 때 module-library에서 가지고 있는 User에 대한 Test Fixture를 중복적으로 각 모듈별로 만들어주어야 하는 별거 아니지만 귀찮은 문제가 있습니다.

각 모듈 module-one, module-two, module-three 테스트 패키지 하위에 필요한 Fixture를 만들어서 사용할 수 있기에 불편함을 감수하고 사용하고 있었는데 Gradle의 java-test-fixtures plugin을 통해 모듈 별 Test Fixture 중복을 제거할 수 있었습니다.

Gradle java-test-fixtures 플러그인 적용하기

module-library/build.gradle.kts

plugins { `java-test-fixtures` }

플러그인 추가 후 여러 모듈에서 사용할 module-library/src/testFixtures 디렉토리를 생성하고 하위에 아래와 같이 Fixture 생성을 위한 클래스를 생성합니다.

module-library/src/testFixtures/kotlin/com.example/Fixtures.kt

object Fixtures { fun user(cn: String): User = User( name = "김규남", orga = "무슨 조직", ) }

testFixtures 사용하기

module-library에 정의된 testFixtures를 사용하기 위해서는 Fixture의 적용이 필요한 모듈에 아래와 같이 의존성을 추가해야 합니다.

module-one/build.gradle.kts

dependencies { implementation(project(":module-library")) testImplementation(testFixtures(project(":module-library"))) // 추가 }

위와 같이 의존성을 추가하고 나면 OneUserTest에서 해당 Fixtures.user 메소드를 호출할 수 있습니다.

module-one/src/test/kotlin/com.example/OneUserTest.kt

class OneUserTest { @Test fun `test`() { val user = Fixtures.user() } }

다른 모듈 module-two, module-three도 동일하게 사용할 수 있습니다.

이제는 각각의 모듈에서 Test Fixture를 위해 중복 코드를 정의하지 않고 module-library/testFixtures 하위에만 Fixture 정의를 위한 코드를 추가해 사용할 수 있습니다.

Reference

Gradle Java Test Fixtures