이런 말을 많이 들었다. "테스트는 필수이다. 좋은 코드 퀄리티를 위해서는 테스트 코드는 필적인 것이다.", "테스트 코드가 없다면 부족한 코드이다" 등의 말을 많이 들었다.
하지만 나는 공감하기 어려웠다. 그렇다면 모든 기능에 대해서 테스트 코드를 작성해야 하는 걸까?
명확한 기능을 가진 단순한 코드 또한 테스트 코드를 만들어야 하는 걸까? 이는 불필요한 작업이 아닐까?
물론 나도 테스트 코드의 필요성은 공감한다. 초반에야 테스트 코드를 작성하는 것이 번거롭고, 개발 속도를 늦추는 일처럼 보일수도 있지만 결국 개발이 진척될수록 테스트 코드의 존재는 개발 속도에 부스터를 달아준다.
왜? 테스트 코드가 존재하다면, 회귀가 방지되고 빠르게 버그를 감지할 수 있기 때문이다.
출처: Unit Testing_블라디미르 코리코프
테스트 코드가 중요한 것은 알고 있다. 그렇다면 모든 기능에 대해서 테스트 코드를 작성해야할까? 기준은 없을까?
테스트 코드를 가성비로 따져보자.
가성비의 판단 기준은 2가지 축으로 나뉜다.
복잡성/도메인 관련성: 테스트의 가치를 결정
단순히 인자로 받은 값을 프로퍼티에 세팅한다거나 로직이 별로 없는 코드를 생각해보자. 이런 결과가 뻔한 코드들은 테스트 효과가 거의 없다. 물론, 테스트 코드를 작성하는 것이 가능은 하다. 그런데 따라오는 이득이 없다.
반면 기능을 봤을때, 로직이 복잡하고 예상치 못한 케이스가 있을 것 같은 코드들을 생각해보자. 테스트 코드를 작성한다면 예상치 못한 버그가 발생했을때 바로 검출이 가능하고, 대처가 가능할 것이다. 이는 분명한 이득이 존재한다.
협력자(외부의존성): 테스트의 비용을 결정
이 2가지 축을 기준으로 2x2 매트릭스를 그릴 수 있다.
복잡성/도메인 관련성과 협력자 수를 축으로 그린 테스트 가성비 매트릭스
출처: Unit Testing_블라디미르 코리코프
여기서 '지나치게 복잡한 코드'에 대해서는 테스트 코드에 대한 지침이 안적혀있다. 이 경우에는 테스트 코드를 작성하는 것이 아닌 리팩토링을 해야한다. 복잡한 코드를 분리해서 '도메인 모델 및 알고리즘'과 '컨트롤러'로 분리해준다.
요약
1. 단위 테스트를 할 때는 '비용 대비 효과'를 고려해야 한다.
2. '테스트의 효과'는 코드의 복잡도, 도메인 관련성을 보고 판단한다.
3. '테스트 비용'은 외부 의존성 갯수로 가늠한다.
출처
Unit Testing(단위 테스트)_블라디미르 코리코프