ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 폴더에서 사용할 수 없다.
    • Test 에서 Fixture를 공유
      • testImplementation testFixtures(project("A”))
        • 의존성을 주입하려는 모듈의 build.gradle에 위와 같은 의존성을 추가해준다.
      • 이때, 공유되는 A의 Fixture는 test 폴더에서만 사용가능하고, testFixtures 폴더에서는 사용불가
Designed by Tistory.