테스트 커버리지 != 테스트 품질

자동화 테스트 코드를 작성하면서 테스트 커버리지(Test coverage)를 테스트의 목표로 설정하는 프로그래머들이 있습니다. 그러나 이것은 잘못된 목표 설정입니다. 그리고 커버리지 100%는 자랑스러울만한 일이 아닙니다.

테스트 커버리지는 테스트 품질을 판단하는데에 큰 도움이 되지 못합니다.

테스트 커버리지

테스트 커버리지는 일반적으로 코드 커버리지와 분기 커버리지로 전체 커버리지를 계산합니다.

코드 커버리지는 코드베이스의 코드 라인들이 테스트 코드들에의해 실행되었는지를 백분율로 나타냅니다. 즉 3줄의 코드 라인에서 3줄이 모두 실행되었으면 100% 이고 2줄만 실행되었으면 66.66%입니다.

분기 커버리지는 코드 베이스의 모든 분기(if 등)들이 테스트 코드들에의해 실행되었는지를 백분율로 나타냅니다. if-else 분기에서 if-else가 모두 실행되었으면 100%이고 else가 실행되지 않았다면 50%입니다.

테스트 품질을 나타내지 못하는 사례

아래에는 하나의 함수와 해당 함수를 테스트하는 간단한 테스트 코드가 있습니다.

Java로 작성되었지만 사례를 살펴봄에 문제가 없습니다.

위 코드 베이스의 테스트 커버리지는 100%입니다. 그런데 정말 이것으로 여러분의 테스트가 품질 좋은 Test suite이라고 생각할 수 있으신가요?

절대 그렇지 못합니다.

divide 함수는 두가지로 결과를 내는 함수입니다. 아래와 같습니다.

  • 나누어진 값
  • 0으로 나누었을 때의 Exception

실제로 divide 함수는 value2에 해당하는 인자값을 0으로 받으면 `ArithmeticException`(in java)으로 결과냅니다.

위에서 두번째에 해당하는 내용이 divide 함수의 의도된 usecase라면 테스트 대상입니다.

즉 Test coverage가 100%임에도 올바른 Test suite을 갖추지 못했습니다.

마치며

이번에 살펴본 사례 외에도 테스트 커버리지를 신봉해선 안되는 사례들이 많습니다. 예를 들어 참조하여 사용하는 라이브러리들이 있습니다.

테스트 커버리지 측정 도구들은 코드 베이스가 참조하여 사용하는 라이브러리까지 파고 들어가지 않습니다.

--

--

Software Engineer

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store