멀티모듈에서의 테스트 픽스쳐 재사용성을 위한 java‐fixtures 플러그인 활용 - ttasjwi/board-system GitHub Wiki
개요
- 멀티모듈로 프로젝트를 쪼개놨지만, 각 모듈에서 테스트 작성에 필요한 픽스쳐가 중복되는 문제가 있다.
- 테스트 픽스쳐을 여러 모듈에서 공통으로 사용할 수 있게, 재사용성을 높일 수 있을까?
테스트 픽스쳐
package com.ttasjwi.board.system.user.domain.model.fixture
import com.ttasjwi.board.system.common.auth.Role
import com.ttasjwi.board.system.common.time.AppDateTime
import com.ttasjwi.board.system.common.time.fixture.appDateTimeFixture
import com.ttasjwi.board.system.user.domain.model.User
fun userFixture(
userId: Long = 1L,
email: String = "[email protected]",
password: String = "1111",
username: String = "test",
nickname: String = "테스트유저",
role: Role = Role.USER,
registeredAt: AppDateTime = appDateTimeFixture()
): User {
return User(
userId = userId,
email = email,
password = password,
username = username,
nickname = nickname,
role = role,
registeredAt = registeredAt,
)
}
- user-domain 모듈에서는 테스트 시, 회원 객체 생성의 편의를 위해 userFixture 클래스를 사용해서 사용자를 생성한다.
- 회원을 생성할 때 편리하게 User 클래스의 도메인 규칙 코드를 호출할 필요 없이 userFixture 함수를 통해 편리하게 테스트를 위한 user를 생성할 수 있다.
- 그리고, 픽스쳐 함수를 통해 사용자를 생성하기 때문에 어느 방식으로 생성됐는 지 애플리케이션 전반에서 디버깅 추적에 용이해진다.
- 그런데 이 기능은 user-domain 모듈 뿐 아니라 user-application-service 등 에서도 테스트의 편의를 위해 사용하면 편리하다.
시도 : 각 모듈에서 중복 픽스쳐 정의하기

- user-application-service 의 test 소스셋은 user-domain 의 테스트 소스셋을 의존할 수 없다.
- main 소스셋에 두면 의존성을 공유할 수 있기야 하겠지만, main 기능에 테스트를 위한 코드가 함께 포함되는 문제가 발생한다.
- 결국 test 소스셋에 두어야하는데 같은 테스트 픽스쳐 생성을 위해, 서로 다른 모듈에서 동일한 픽스쳐를 생성해서 정의해야하는 중복문제가 발생한다.
- 테스트 픽스쳐가 여러 모듈에 중복되면 중복될 수록, 픽스쳐 사양이 바뀌게 되면 각 모듈 갯수만큼 코드를 고쳐야한다.
시도 : 별도의 외부 모듈에서 테스트 픽스쳐를 만들어서 공유하게 하는 방법

- user-domain 에서 도메인 개념을 정의
- user-domain-fixture 모듈을 만들어 main 소스셋에서 테스트 픽스쳐를 선언(userFixture)
- user-application-service, user-domain 에서 user-domain-fixture 의 main 소스셋을 의존하게 하는 것은 어떨까?
- 하지만 이 방법은 실패한다.
- user-domain-fixture 의 main 소스셋역시 user-domain 의 main 소스셋을 의존한다.
- user-domain 의 test 소스셋에서 user-domain-fixture 의 main 소스셋을 의존한다.
- 이것은 모듈간 순환참조이고, 결국 에러가 발생한다.
java-fixtures 플러그인 추가

- gradle의 java-fixtures 플러그인을 사용하면, 각 모듈별로 테스트픽스쳐 소스셋(testFixtures) 를 사용할 수 있다.
- 규칙
- main 소스셋은 다른 소스셋을 의존하지 않는다.
- test 소스셋은 같은 모듈의 main 소스셋과 testFixtures 소스셋을 의존한다.
- testFixtures 소스셋은 main 소스셋을 의존한다.
- 각 모듈들은 모듈 의존 설정을 통해 다른 모듈의 testFixtures 소스셋을 의존할 수 있다.
성과

- user-domain 의 testFixtures 모듈에 userFixture 코드를 둔다. (main 소스셋을 의존하기 때문에 작성이 가능하다.)
- user-domain 의 text 모듈은 testFixtures 모듈을 의존하기 때문에 userFixture 를 사용할 수 있다.
- user-application-service 에서는 text 소스셋 또는 testFixtures 소스셋에서 user-domain 의 testFixtures 의존성을 가질 수 있게 설정할 수 있다.
- testImplementation : test 소스셋에서 다른 모듈의 testFixtures 의존
- testFixturesImplementation : testFixtures 소스셋에서 다른 모듈의 testFixtures 의존 (의존이 전파되어 test 소스셋에서도 사용할 수 있게 된다.)
- userFixture 코드를 user-domain 의 textFixtures 소스셋 한 곳에 두어 여러 모듈에서 재사용할 수 있고 중복문제를 해결할 수 있게 됐다.