테스크 코드 분할
Last updated
Was this helpful?
Last updated
Was this helpful?
이번에 회사에서 이슈사항이 있었다 현재 배달 쪽 프로젝트에는 800개가 넘는 테스트코드가 존재한다 (물론 내가 짠것 보다 레거시로 있는 코드가 훨----씬 많음) 근데 이슈사항은 이러했다 \
우리는 개발을 진행할 때 개발 > 테스트코드 작성 > 풀테스트(자코코에서 제공해주는 프로젝트 내의 모든 테스트를 한꺼번데에 돌려주는 풀테스트 - 아래참고) 이렇게까지 진행하고 나서 배포를 진행하고 있다 그래서 맨날 풀테스트를 돌리면 오래걸리는 이슈가 있었다 물론 리얼디비에 붙어서 진행하는 테스트도 있고 그냥 h2를 사용하는 테스트도 있다 이렇게 다양한 테스트를 한꺼번에 돌려보니까 여러개의 스프링부트가 한꺼번에 떴다가 꺼지면서 우리회사의 필수 요소인 Graceful Shutdown이 적용되지 않으며 셧다운이 안먹히는 순간부터 그 이후까지의 모든 테스트가 실패해 버리는 이슈가 있었다! 그래서 이미 수가 엄청나게 많아진 테스트를 일단 레거시 테스트코드로 남겨두고 개발이 끝나고 배포하기 전에만 슬쩍 돌려보는 용도로 사용하자는 방법이 나왔다 \
이렇게 추가는 완료되었는데... 앞으로의 문제는 이거다.. 이게 지금 gradle에 어떻게 들어가있는지..? 지금 기존 테스트 / main src / 신규 테스트 이렇게 구성되어있는 상황에서 기존의 gradle에 등록되어있는 jacoco의 fullTest나 test task는 기존 테스트만을 실행해 주고 있는 상황이라서 앞으로 해야할 것은 이러하다 - (신규 테스트를 돌리는 task + 기존 테스트를 돌리는 task) 이러한 테스크를 생성
뭐 찾아도 안나오고... 테스트에 있는 소스를 묶어서 돌려볼려고해도 안나오고.. 총체적 난국이네.. 내일하자.. 꼭 성공시킨다 요거!!
일단 그렇다고 해서 테스트코드를 접을 수는 없으니 이제 다른 신규 환경에서 신규세팅들과 함께 원하는 언어로 테스트 코드를 작성해보자는 방안이 나왔다 지금의 테스트 코드 구성은 그루비 언어로 spock 테스트 프레임워크를 사용해서 짜고 있으며 구조는 bdd를 기반으로 시나리오로 테스트코드를 작성 하고 있다 그런데 현재 테스트 코드 자체는 뭔가 구성도 뒤죽박죽인 감이 없지 않게 있으며 추가로 테스트 환경에 세팅해둔 몇 가지의 고정된 값으로만 확인이 가능한 상황이다 \
앞으로의 테스트 코드는 코틀린을 사용해서 작성하고, JUnit5을 사용하는 것을 베이스로 두고 다양한 미리 있는 세팅 값들을 항상 랜덤 값으로 박혀서 나올 수 있도록 수정하고 최대한 클래스 파일을 나누지 않는선에서 intellij에 있는 해당 클래스파일의 구조를 한눈으로 볼 수 있는 Class Structure 로 확인하며 한줄로 긴--테스트 코드를 만들자 요구사항은 위와 같았다 \
그래서 일단 해야할 것은 테스트코드를 분리하는 작업이였다 원래 프로젝트를 만들게 되면 기본적으로 생성되는 구조는 main module, test moudle 이다 그런데 어떻게 새로운 모듈을 만드느냐... 에 대해서 고민을 해보고 첫 시도는 이미 만들어져 있는 (테스트 800개가 들어있는) 테스트 패키지에 코틀린 패키지를 만들고 그 내부에 구현을 하려고 했었다 근데 그렇게 해보리면 결국은 풀테스트가 같이 돌아버리는? 그러한 이슈가 있더라.. 그래서 결국은 빌드툴인 gradle 단에서부터 분리되는 그러한 테스트 모듈이 필요하단 것을 알게되었다 \
구글링을 열심히 해보니 gradle 공식 홈페이지에 요러한 부분이 있더라! 근데 영어는 힘드니까.. 다시 구글링을 해보니 테스트 코드를 분리하는 글들이 몇가지 있더라! 그래서 그 방식을 확인해보니 gradle 단에서 신규 모듈을 생성하고 그걸 sourceSet으로 잡아서 사용하는 그러한 내용의 글이였다 그 방법에 대해서는 https://docs.gradle.org/current/userguide/java_testing.html#sec:configuring_java_integration_tests https://velog.io/@mu1616/javagradle단위-테스트unit-test와-통합-테스트integration-test-환경-분리 여기에 잘 적혀있다 진짜 간단한 flow를 보면 이러하다 : gradle에서 모듈세팅을 해둠 > ide에서 디렉토리를 만듦면 알아서 그걸 모듈로 인식 > 테스트 코드 작성 후 돌리면 돌아감 https://github.com/kyu9/KDD 그리고 진----짜루 간단하게 작업해본 프로젝트가 있다 \
작업하는데 특징으로는 일단 외부 모듈에서 main 에 있는 코드를 사용하기 위해서는 패키지의 이름과 경로를 무조건 똑같게 해야 한다는 점이다 그-래-야 테스트로 인식해서 메인에 있는 코드를 기준으로 해서 스프링부트 테스트가 가능하게 된다 이제 그렇게해서 보면 진짜로 신규 패키지에서 간단하게 테스트를 작성하니까 잘만뜨더라 근데 여기까지가 내 간단한 프로젝트에서 그렇게 되는 거였고 회사에서 적용해보려고 했구만 워낙 큰 플젝이라 그런지 테스트를 진행하는데 있어서 property에서의 다양한 세팅들이 필요했었고 이 세팅들이 안먹는 이슈가 있었다 그래도 일단은 테스트코드가 돌면서 기본적으로 메인의 프로퍼티도 참조를 한다고 생각을 하고 어떤 세팅이 문제인가 들여다 봤었는데 정말 속아보자는 생각으로 그냥 진짜 스프링부트가 뜨는데 필요한 설정들을 신규 모듈에 넣어보았다 그랬더니 왈라 진짜 잘만 되더라 아무튼 일단 스프링 부트 테스트가 뜨는 것을 보고 회사에서 튀어나왔는데 차주에는 계속해서 신규 테스트 구성을 위해서 힘써보자 물론 또 많은 이슈사항이 있겠지만.. 일단 시작은 되었으니 화이팅\
또 이슈사항이 있거나 작성하고 싶은게 있으면 추가로 작성해보겠당 추가로 이번에 진행하고 있는게 테스트 모듈1, 테스트 모듈2 이렇게 한 번에 하나씩의 모듈을 진행하는 방식이 아니라 하나의 테스크를 만들어서 그 테스크를 통해서 기존의 모듈에 있는 모든 테스트와 신규로 만든 신규모듈에 있는 모든 테스트를 한꺼번에 진행할 수 있도록 하는 방법을 고안 중이였다.
gradle 에 있는 finializedBy이라는 키워드를 기준으로 해서 진행할 수 있도록 해봄
기존에 만들었던 IntegrationTest 이라는 테스크를 기준으로해서 fullTest 테스트가 들어가는 순간에 다 끝나고 integrationTest 을 붙혀서 실행하도록 해보니까 잘만 되어더라!! \
\