[Toss Slash 21] 테스트 커버리지 100%

시작하기 앞서

토스 뱅크 - 이응준
테스트 커버리지는 어느정도가 적당한가?
'클린 코더'라는 책에 테스트 커버리지는 100%를 강력히 요구한다. 라고 나와있었다.
코틀린으로 개발 중인 프로젝트에 기존 커버리지 50%에서 100%를 유지하고자 시도해봤다.

높은 커버리지의 이점

자신있게 누를 수 있는 배포 버튼
모든 코드가 테스트되었다는 사실에서 오는 자신감
안정감은 과감한 시도를 가능하게 했다. → 거침없는 리팩토링
리팩토링에 문제가 있다면 테스트가 알려줄 것이다.
불필요한 프로덕션 코드가 사라진다. → 남아 있으면 이 또한 테스트해야 한다.
프로덕션 코드에 대한 이해도 상승
점점 쉬워지는 테스트 작성 → 이미 작성된 테스트를 참고해 새 테스트를 작성할 수 있다.

테스트 커버리지를 높이기 위해 필요한 것들

믿음(어떤 코드든 테스트할 수 있다는 믿음) & 시간(작성할 시간이 없으면 무용지물)이 필요함
테스트가 없으면 리팩토링할 수 없고, 리팩토링하지 않은 코드는 이해할 수 없게 되고, 이해할 수 없는 코드는 수정할 수 없다고 확신하고 있다.
프로젝트 초기부터 높은 상태를 유지하는 것이 가장 좋다.
Jacoco를 이용하면 커버러지가 n%가 아니면 빌드될 수 없게 할 수 있음.

어떤 어려움이 있었나?

느려지는 테스트 → 테스트 케이스 400개를 넘어서면서 실행 시간이 1분을 넘기기 시작
개발자가 작업하면서 모두 통과했는지 확인할 때, 많은 시간이 소요된다.
배포하는 중에도 시간이 추가되므로, 생산성이 저하된다.

느려지는 원인 및 해결

스프링 애플리케이션 컨텍스트 로딩하는 데 걸리는 시간 → 이를 제거, WebTestClient는 컨텍스트 로딩 없이 테스트 가능

테스트 케이스가 증가하면서 다시 느려지는 상황

테스트 케이스 1,600개를 넘어서면서 1분이 넘는 시간이 걸리기 시작했다.
프로파일링을 했음 → 인텔리제이 내장 async-profiler 이용하여 → 테스트 코드를 성능 프로파일링
테스트를 더 빠르게 실행할 수 있게 Junit 테스트 설정을 고침 → 테스트가 클래스 단위로 병렬로 실행하도록 변경했다. (함수 단위로 할 수 있었지만, 크게 개선되지 않았다)
노트북을 바꿨더니, 2.5배가 빨라졌다. (40초 → 6초대)

테스트 하기 힘든 테스트는 어떻게 했나?

모킹으로 어떻게든 테스트가 가능했다.

100%를 넘어서 해결해야 할 것들

테스트를 잘못 작성하는 경우
요구 사항에 오해가 생긴 경우
컴포넌트간 협업이 실패한 경우

테스트 케이스가 부족할 때

기능에 버그가 있어도 테스트가 잡아내지 못하는 경우가 있다. 그럼에도 불구하고 테스트 커버리지는 100%가 될 수 있다.

Mutation Testing 기법

프로덕션 코드를 무작위로 조작한다.
테스트가 통과하면 테스트 케이스가 부족한 것
pitest.org → JVM 기반에서 동작하는 애플리케이션에 Mutation Test를 할 수 있다.
부족한 테스트를 잡아낼 수 있다.
단점으로 엄청나게 느리다. → 중요한 로직에만 부분적으로 적용하는 것이 좋다.
상당히 연산을 많이 하는 비싼 작업 → 무한 루프가 발생할 수 있어 사용하지 않았다.

개발자가 요구 사항을 오해하는 경우

테스트로 스펙 문서를 만들어 → 요구 사항을 검토
수집한 테스트의 DisplayName으로 스펙 문서 생성 도구를 직접 개발했다. 그러나 아래와 같은 문제가 있었다.

컴포넌트간 협업 실패 문제

다른 서버 컴포넌트에 버그가 있는 경우가 종종 있다.
이를 해결하기 위해 Consumer Driven Contracts 기법이 있다.

결론

테스트 커버리지는 얼마든지 높일 수 있다.
테스트 커버리지가 낮으면 빌드 실패하게 하자.
테스틑 빨라야 한다.
커버리지가 100%라도 버그는 있다.

적용점

내가 만든 '교내 챗봇 서비스'나 '우아한테크코스 커뮤니티'를 이용해서 테스트 코드에 대해 프로파일링을 해보자
테스트 실행 속도 높여보기
Junit 테스트 설정 고쳐보기 → 클래스 단위나 함수 단위로 병렬로 테스트해보기
테스트 커버리지 100% 유지해보기..?
테스트 문서화해주는 도구 직접 만들어보기?

참고 자료

TOP