본문 바로가기
Programming/Study

테스트를 실행은 하고 싶은데 빌드에서는 제외하고 싶을 때

by JKROH 2023. 12. 7.
반응형

 통합 테스트를 진행하면서 가장 걱정되는 부분은 배포 및 배포 자동화를 진행했을 때는 이 테스트들이 수행되면서 데이터베이스를 건들 것 같다는 점이었다. 또한 통합 테스트 메소드가 많아지면 많아질 수록 빌드에는 더욱 많은 시간이 들어갈 것이었다. 그렇다고 통합 테스트를 해보지 않을 수도 없었다. Spring Security가 잘 적용되는지를 알아봐야했다. 따라서 빌드에서는 해당 테스트를 빼고, 대신 테스트가 수행되게는 하고자 시도해봤다.

 

 가장 먼저 수행해 본 방법은 build.gradle에서 아예 해당 테스트가 빌드에서 빠지게 설정한 방법이었다.

 

 이렇게 설정하고 테스트를 수행하니 다음과 같은 결과가 나왔다.

 

 우리가 수행하는 test는 기본적으로 gradle 기반으로 수행된다. 그런데, gradle빌드에서 해당 테스트를 빼버렸으니 당연히 수행이 안되는 것이다. 이럼 나가린데... 나는 테스트는 하고 싶다 이 말이다...

 

 그래서 방법을 찾아보던 중 한 글을 통해 해결 방법을 알 수 있었다. 요약하자면 다음과 같다.

  • IDE에서 gradle로 개별 테스트를 진행시키면 아래와 같은 명령어를 실행시킨다.
$ gradle :module:test --tests "com.mys.project.YourSlowTest"
  • --test 이후 전달되는 문자열이 내가 수행하는 테스트의 path다. 저걸 commanLineIncludePatterns라고 부른다.
  • 그런데, 빌드 하면서 수행되는 테스트는 --tests명령어를 전달하지 않는다. 즉, commandLineIncludePatterns가 비어있다.
  • 그럼 저 cLIP가 비어있을 때는 내 테스트를 제외하면 되는거구나!

 해당 부분을 다시 build.gradle파일에 적용했다.

 

excludeTags는 저 태그가 붙은 테스트들을 제외하라는 뜻이다. JUnit 5부터 @Tag 애너테이션을 통해 특정 테스트들을 마킹할 수 있다. 또한 빌드를 하면서 테스트가 수행되기 전에 해당 태그가 붙은 테스트들은 제외해야 한다. 따라서 doFirst를 사용해 먼저 확인하도록 해야 한다.

 

 나는 통합 테스트를 진행하는 SpringSecurityTest 클래스에 붙였다. 이름을 integration-test로 바꿔야겠다. 이제 해당 설정이 잘 적용되는지 알아봐야겠다. 먼저, 개별로 테스트하면 실패하는 테스트를 만들자.

 

 위의 테스트는 아주 야무지게 실패한다. 로그인 안하면 조회도 못하게하는 몹쓸 놈 같으니... 만약 빌드 시 저 테스트가 포함되어 있다면 빌드가 제대로 되지 않을 것이다. 빌드를 진행해보자.

 

 해당 테스트는 여전히 실패하게 되어있지만, 빌드에는 성공한다. 테스트가 적절히 제외되었음을 알 수 있다.

 

 오늘은 JUnit의 @Tag와 gradle 명령어를 사용해 개별 테스트는 수행하되 빌드에는 포함되지 않게 적용해봤다. 통합 테스트를 빌드하는데 걸리는 시간은 2초 정도로 미미하게나마 줄일 수 있었지만(테스트가 많아지면 그만큼 늘어날 것이다), 사실 통합 테스트를 위한 DB환경 설정에는 TestContainer를 사용하는 방법도 있다고 한다... 이 부분은 좀 더 찾아봐야겠다.

반응형

댓글