본문 바로가기

테스트 커버리지는 높을수록 좋을까?

이번 포스팅은 Effective Unit Testing를 정리한 글입니다.

서론

옛날에 만들었던 프로그램들을 TDD로 다시 만들면서 테스트 커버리지 수치에 신경 썼습니다. 어느덧 95%는 넘었고 더 높이기 위해서는 검증이 필요하지 않은 로직을 테스트 해야 했고, 문득 이런 생각이 들었습니다.

100%가 된다고 과연 완벽할까? 테스트 작성도 결국 비용이 아닌가?

이런 고민을 하던 찰나 마침 Effective Unit Testing 에서 정답을 찾았습니다.

 

100% 코드 커버리지 달성이 중요한 게 아니다.

테스트의 가치는 테스트가 확인하지 못한 코드가 어떤 것인가와 테스트가 프로그래밍 실수를 얼마나 정확하게 잡아내는가에 좌우된다. 100%를 달성했다고 해서 결합이 없다고 보장해주는 건 아니다. 애플리케이션 동작이 올바른가와는 상관없이, 그저 모든 코드를 한 번씩은 실행해보았다는 것만을 보장할 뿐이다. 그러니 커버리지에 대한 강박관념은 버리고 의미 있는 테스트를 작성하는 데 집중하길 바란다.

테스트 수가 많아질수록 새로 추가한 테스트의 가치는 떨어진다. 왜냐하면, 개발자는 일반적으로 가장 핵심적인, 이를테면 가장 중요하고 위험 부담이 큰 코드를 먼저 검사하기 때문이다. 그와 달리 작성한 후에도 확인하지 않은 코드는 십중팔구 가장 사소하고 문제될 소지가 적은 부분이다.

추가로 책에서는 테스트로 얻을 수 있는 두 개의 고지가 있다고 한다. 테스트의 잠재 가치를 모두 일깨우려면 두 개의 고지를 모두 점령해야 한다.

  • 이미 매운 높은 커버리지를 달성하여 테스트를 더 만들어봐야 얻을게 없는 지점 (실선)
  • 테스트를 설계 수단으로 이용하는 경우 (점선)
  • 전자가 테스트를 갖춰야 하는 이유라면 후자는 좋은 테스트를 갖춰야 하는 이유다.

 

처음 도달할 수 있는 낮은 고지에 이르면 테스트를 추가해도 더 이상의 가치를 끌어내기 어려워진다. 그 위의 두 번째 고지는 테스트가 단순한 검증 수단 이상임을 깨닫는 사고의 전환을 통해야만 발견할 수 있는 더 높은 경지다.

그렇다면 테스트가 검증 수단 외에 무엇이 있을까?
테스트는 실사용에 적합한 설계를 끌어내준다. 즉, 테스트는 코드를 설계하는 한 방식이기도 하다. 이렇게 테스트를 설계 도구로 인식하는 순간 품질 고지를 뛰어넘어 설계 고지에 도달하는 길이 열리게 된다.

 

정리

테스트 코드의 잠재가치를 끌어내기 위해서는 두 가지 조건이 필요하다.
첫째는, 의미 있는 테스트가 작성된 일정 수준 이상의 테스트 커버리지
둘째는, 테스트를 설계의 수단으로 이용하여 코드 품질 향상

최근에 테스트에 대해서 공부하면서 잠깐 Effective Unit Testing을 읽었는데 책의 내용이 좋아서 정리 해봤습니다.
그럼 이만.. 👋

'Test' 카테고리의 다른 글

TDD의 장점은 무엇일까?  (0) 2019.12.28