-
TestFixture를 잘 사용해보기Backend/Test 2024. 12. 27. 23:31
TestFixture ?
TestFixture는 Test에 사용되는 Mocking되어지는 객체입니다.
Wikipedia - 테스트 실행에 필요한 시스템 상태와 입력 데이터를 설정하는데 사용됨
기존에 사용했던 방법
Spring boot project에서는 /src/java, /src/test 두 개의 폴더가 존재해 test와 관련된 내용은 /src/test 에 모아놨다. 그리고 TestFixture 또한 여기 폴더에 두었다. 그렇다 보니 test폴더에는 테스트 코드와 테스트를 위한 테스트 픽스처가 한 곳에 있어 보기가 안 좋았고, 이를 다른 모듈에서 (멀티 모듈로 사용하고 있었다.) 공유가 된다면, 테스트 코드까지 공유가 되어 "더 좋은 방법이 없을까?" 라는 고민이 있었다.
찾다보니 Gradle에서 TestFixture 만을 위한 폴더를 지원해주는걸 알고 적용해봤다.
TestFixtures folder
plugins { id 'java-test-fixtures' }
를 추가하면, build.gradle에서 다음과 같은 커맨드를 사용할 수 있다.
plugins { id 'java-test-fixtures' } dependencies { ... testImplementation testFixtures(project(":core:A")) testFixturesImplementation testFixtures(project(":support:util")) testFixturesImplementation testFixtures(project(":core:A")) }
그리고 아래 그림 처럼 testFixtures라는 폴더에 Fixture만을 위한 폴더를 만들어서 모아 놓을 수 있다.
TestFixture Folder 💡
이렇게 되면, 예전에 테스트코드를 작성하면서 Fixture도 test폴더에 모아놓는게 보기 안 좋다고 생각했는데, 분리를 하여 test 폴더에는 test code만, testFixtures에는 test에 사용되는 fixture만 모아둘 수 있어서 깔끔한 프로젝트 아키텍처를 가져갈 수 있어서 좋다.
TestFixture의 공통, 헬퍼, 재사용
Multi Module로 Spring boot 프로젝트를 구성하면, 예를들어 아래 블록처럼 3개의 모듈이 있고, A → B, A→ C의 의존성을 가진다고 가정하면 분명 B, C TestFixture에서 A의 fixture를 사용하는 경우가 생길 것이다.
/A-Module /B-Module /C-Module
그러면, 각 모듈의 build.gradle에서 test dependency를 걸어줘야한다. 규칙은 다음과 같다.
- TestFixture끼리 공유
- testFixturesImplementation testFixtures(project("A”))
- 의존성을 주입하려는 모듈의 build.gradle에 위와 같은 의존성을 추가해준다.
- 이때, 이 Fixture는 test 폴더에서 사용할 수 없다.
- testFixturesImplementation testFixtures(project("A”))
- Test 에서 Fixture를 공유
- testImplementation testFixtures(project("A”))
- 의존성을 주입하려는 모듈의 build.gradle에 위와 같은 의존성을 추가해준다.
- 이때, 공유되는 A의 Fixture는 test 폴더에서만 사용가능하고, testFixtures 폴더에서는 사용불가
- testImplementation testFixtures(project("A”))
- TestFixture끼리 공유