SpringBoot 환경에서 테스트코드를 작성할 때 구성정보를 파일로 관리하고 싶은 경우가 있다. Spring 환경에서 application.yml 파일이 구성정보를 파일로 관리하는 대표적인 예인데 이 방식을 테스트 코드에서도 활용하고 싶은 경우를 말한다.
만약 테스트 클래스에 @SpringBoot 를 명시했다면 테스트 코드 수행시 스프링 컨테이너가 로드되고 src/main/resources 하위에 있는 구성 파일들을 참조할 수 있다.
알다시피 src/main/resources 하위에는 구성정보를 관리할 application.yml 파일과 application-*.yml 파일을 함께 둘 수 있고 application.yml 파일이 가장먼저 읽혀지고 어플리케이션 실행 시 지정하는 spring.profiles.active 값에 따라 application-*.yml 파일의 내용이 오버라이드 된다.
이에 테스트 환경에서만 필요한 구성정보를 application-test.yml 파일에 정의해 놓고 테스트 클래스에 아래와 같이 profile를 지정해서 사용할 수 있다.
@SpringBootTest
@ActiveProfiles({"test"})
public class Test {
...
}
그런데 src/test/resources 에 application.yml 과 application-*.yml 을 넣어두더라도 테스트 코드 수행시 동일한 효과를 볼 수 있다. 다만 application.yml를 이곳에 둘 경우 src/main/resources/application.yml 파일의 내용이 오버라이드 되는 것이 아니라 처음부터 src/test/resources/application.yml 이 로드되는 것 같다. 이 부분만 조심하면 테스트코드에서 활용할 구성파일을 src/test/resources 에서 관리해도 된다.
가끔 구글링 하면 테스트 클래스에 @TestPropertySource 를 정의해서 사용하는 경우가 있다. 해당 어노테이션의 인자로 Spring[]을 선언할 수 있고 참조하고 싶은 구성파일을 경로와 함께 명시해놓으면 된다.(classpath 기준으로도 명시할 수 있다) 그런데 이럴 필요없이 그냥 src/test/resources 디렉토리 하위에 구성파일을 두면 테스트 컨텍스트에서 자동으로 로드한다.
결국 테스트 구성파일은 src/main/resources 에 둬도 되고 src/test/resources 에 둬도 된다는 말인데 어디에서 관리하는 게 좋을까?
어쨌든 테스트 대상이 되는 것은 src/main/java 하위 코드 들이고 이 코드들은 src/main/resources 하위에 있는 구성파일에 의존하고 있기 때문에 테스트에 필요한 구성파일도 결국 해당 구성파일의 틀을 크게 벗어나지 않는다.
즉, src/main/resources/application.yml 파일의 내용을 테스트 환경에 맞게 오버라이드 해서 사용하는 경우가 대부분 이라는 말이다. 때문에 테스트 구성파일도 src/main/resources 에서 함께 관리하는게 맞아보이기도 한다.
하지만 이런 논리라면 테스트코드 역시 src/main/java 하위 코드들에 의존하고 있기 때문에 src/main/java 에서 함께 관리해야 하는데 이렇게 되면 기본적으로 빌드시 실제 서비스에는 필요없는 테스트코드가 함께 패키징 되게 된다.
결국 src/main 패키지에는 실제 서비스에 필요한 자원만 존재해야 하고 테스트코드와 테스트 구성파일은 모두 src/test 패키지 하위에서 관리하는 것이 적절한 선택이다.
'Backend > TDD, Junit' 카테고리의 다른 글
Mockup 서버는 무엇을 사용해야 하나? (0) | 2021.07.22 |
---|---|
SpringBoot 1.5.x 에서 Junit5 사용하기 (with Maven) (0) | 2021.07.20 |