Backend/TDD, Junit

테스트 구성파일 관리

findmypiece 2021. 7. 21. 14:46
728x90

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 패키지 하위에서 관리하는 것이 적절한 선택이다.

 

728x90