Gradle Test Fixtures Plugin 소개
포스트
취소

Gradle Test Fixtures Plugin 소개

문제 상황

  • Gradle 멀티 모듈 프로젝트를 생각해보자
  • 하나의 모듈에서 테스트 코드에서 사용할 용도로 test sourceSet에 테스트 객체 builder 클래스를 만든다
  • 위 모듈을 의존하는 모듈들에서는 해당 builder 클래스를 사용할 수 없다. (test sourceSet의 클래스들은 jar 파일(컴파일된 모듈)에 포함되지 않기 때문)

해결방법 및 또다른 문제점

  • builder 클래스를 각 모듈 test sourceSet에 복사 -> 중복 코드 관리 어려움
  • 테스트용 모듈을 만들고 각 모듈에서 이 모듈을 의존하게 함 -> 꽤 괜찮은 방법. 그나마 단점은 대상 클래스와 builder 클래스의 경로가 멀어짐.

java-test-fixture

  • testFixtures sourceSet이 생김
  • test sourceSet은 자동으로 testFixtures sourceSet에 의존함
    • test -depends-> testFixtures -depends-> main
  • test-fixtures jar 파일이 생김 -> 컴파일된 testFixtures sourceSet의 클래스들
  • 다른 모듈의 testFixtures 클래스들을 의존하려면 아래와 같이 선언
    1
    2
    3
    
    dependencies {
      testImplementation(testFixtures(project(":domain")))
    }
    

testRuntimeOnly

  • 모듈에 testRuntimeOnly로 추가된 의존성은 testRuntimeClasspath에 추가됨
  • 다른 모듈이 위 모듈을 의존할 때, runtimeClasspath 의존성은 전이됨(transition)
    • 하지만 testRuntimeClasspath 의존성은 전이되지 않음
  • h2 DB 의존성과 같이 각 모듈의 testRuntimeClasspath에 전이되기를 원하는 의존성들이 있을 수 있음
  • 이런 경우 testFixturesRuntimeClasspath에 의존성을 추가하면 됨
    • 다른 모듈에서 testRuntimeOnly(testFixtures(...))와 같이 선언하면 됨

Conclusion

  • java-test-fixtures Gradle 플러그인을 통해 각 모듈의 test fixture들을 관리할 수 있다
  • Multi-module 프로젝트 test 환경 구성에 유용하다
  • main 코드와 test fixture를 동일한 모듈에서 관리할 수 있다

References

  • https://toss.tech/article/how-to-manage-test-dependency-in-gradle
  • https://docs.gradle.org/current/userguide/java_testing.html#sec:java_test_fixtures
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

Spring WebFlux WebClient Builder bean 사용 이유 (ObjectMapper bean)

Spring Async Task vs Kotlin coroutines