Testing/Unit Testing

단위 테스트의 목표

Seung-o 2023. 12. 3. 22:41

개요

 

단위 테스트를 배운다는 것은 테스트 프레임 워크나 목 라이브러리 등과 같은 기술적인 부분을 익히는 것에 그치지 않는다. 단위 테스트는 단순히 테스트를 작성하는 것보다 더 큰 범주이다. 테스트에 드는 노력을 가능한 한 줄이고 그에 따르는 이득을 최대화해야 한다. 두 가지를 모두 달성하기란 쉽지 않다.

 

 

단위 테스트 현황

 

지난 20년간 단위 테스트를 적용할 것을 독려하는 분위기가 자리 잡았으며, 대부분의 프로그래머는 단위 테스트를 실천하고 중요성을 알고 있다. 그냥 쓰고 버리는 프로젝트가 아니라면, 단위 테스트는 늘 적용해야 한다.

 

기업용 애플리케이션 개발 프로젝트는 거의 모두 단위 테스트가 적용되어 있으며, 제품 코드와 테스트 코드의 비율은 1:1에서 1:3 ( 제품 코드 한 줄 : 테스트 코드 세 줄 ) 정도가 된다. 이에 따라 단위 테스트에 대한 논쟁은 "단위 테스트를 작성해야 하는가"에서 "좋은 단위 테스트를 작성하는 것은 어떤 의미인가"로 바뀌었다.

 

많은 프로젝트에 자동화된 테스트가 있고, 심지어 테스트가 많다. 그럼에도 구현된 기능에 새로운 버그가 지속적으로 나타나며 도움을 약속했던 단위 테스트는 이를 전혀 완화하지 못한다. 때로는 테스트 상황을 더 나쁘게 할 수 있다. 이는 누구나 처할 수 있는 끔찍한 상황이고, 제대로 작동하지 않는 단위 테스트의 결과이다. 

 

단위 테스트의 목표

 

흔히들 단위 테스트 작성이 더 나은 설계로 이어진다고 말한다. 이는 사실이긴 하나, 이것이 단위 테스트의 주목표는 아니다. 단지, 좋은 사이드 이펙트일 뿐이다. 

 

단위 테스트와 코드 설계의 관계

코드를 단위 테스트하기 어렵다면, 코드 개선이 반드시 필요하다는 것을 의미한다. 하지만 반대로 단위 테스트하기 쉬운 코드가 반드시 좋은 코드 품질을 보장하지는 않는다.

 

 

단위 테스트의 목표는 소프트웨어 프로젝트의 "지속 가능"한 성장을 가능하게 하는 데에 있다. 

 

테스트 유무에 따른 성장 추이 그래프

 

테스트가 없는 프로젝트는 초기에 낮은 작업 소요 시간을 바탕으로 빠른 성장을 보여줄 수 있지만, 시간이 지나면서 개발 속도가 현저히 느려지고, 나중에는 진행 자체가 어려워질 수 있다. 개발 속도가 빠르게 감소하는 이 현상을 소프트웨어 엔트로피 ( software entropy )라고도 한다. 

 

소프트웨어에서 엔트로피는 품질을 떨어뜨리는 코드 형태로 나타난다. 코드베이스에서 무언가를 변경할 때마다 무질서도가 증가한다. 지속적인 정리와 리팩터링 등이 이루어지지 않으면 더욱 많은 버그를 양상하고 소프트웨어 수정이 어려워진다. 

 

테스트는 이에 대한 안정망 역할을 하며, 대부분의 회귀에 대한 보험을 제공하는 도구라 할 수 있다. 즉, 리팩터링 이후에도 기존 기능이 잘 작동하는지 도움을 줄 수 있다. 

 

회귀( regression )이란?

회귀는 코드 수정 후에 기능이 의도한 대로 작동하지 않는 경우다. 소프트웨어 버그와 회귀는 동의어이다.

 

물론 테스트의 단점도 존재하는데, 그래프에서 볼 수 있는 것처럼 프로젝트 초기부터 테스트를 생성하고 관리하는 비용이 발생한다는 점이다. 그러나 프로젝트 후반에도 잘 성장할 수 있도록 하므로 장기적으로 보면 그 비용을 메꿀 수 있다.

 

좋은 테스트와 좋지 않은 테스트를 가르는 요인

 

단위 테스트가 프로젝트 성장에 도움이 되는 것이 맞지만, 테스트를 작성하는 것만으로는 충분하지 않다. 잘못 작성한 테스트는 여전히 같은 결과를 초래할 수 있다. 

 

좋은 테스트와 잘못된 테스트에 따른 성장 추이 그래프

 

모든 테스트를 작성할 필요는 없다. 일부 테스트는 아주 중요하고, 소프트웨어 품질에 매우 많은 기여를 한다. 그 외의 테스트는 코드가 수정될 때마다 잘못된 경고를 발생시키고, 회귀 오류를 알아내는 데 도움이 되지 않으며, 유지 보수를 어렵게 만든다. 

 

따라서 프로젝트에서 테스트를 많이 작성한다고 해서 단위 테스트이 목표를 달성할 수 있는 것은 아니다. 테스트의 가치와 유지 비용을 모두 고려해야한다. 높은 유지 보수 비용으로 인해 순가치가 0에 가깝거나 심지어 0보다 작은 테스트를 만드는 것은 지양해야한다. 오직 고품질 테스트에만 집중해야하며, 고품질 테스트만이 테스트 스위트에 남을 만한 테스트 유형이다.