Goal-Of-Unit-Testing
1 단위 테스트 현황
- 기업용 애플리케이션 개발 프로젝트는 거의 모두 단위 테스트가 적용돼 있다
- 수많은 단위 테스트와 통합 테스트를 통해 좋은 코드 커버리지를 달성하고 있다
- 제품 코드와 테스트 코드의 비율이 점점 높아지고 있다
- 단위 테스트에 대한 논쟁은 이제
단위 테스트를 작성해야 하는가?에서좋은 단위 테스트를 작성하는 것은 어떤 의미인가?로 바뀌었다
2 단위 테스트의 목표
- 단위 테스트 활동이 더 나은 설계로 이어진다. 하지만 더 나은 설계는 단위 테스트의 주목표는 아니고 부수 효과일 뿐이다
- 단위 테스트의 궁극적인 목표는 소프트웨어 프로젝트의 지속 가능한 성장을 가능하게 하는 것이다
테스트가 없는 일반 프로젝트
- 처음에는 발목을 잡을 것이 없으므로 빨리 시작할 수 있다
- 아직 잘못된 아키텍쳐 결정이 없고 걱정할 만한 코드가 있지도 않다
- 시간이 지나면서 점점 더 많은 시간을 들여야하고 결국 개발 속도가 현저히 느려지고, 심지어 전혀 진행하지 못할 정도로 느려질 수 있다
- 개발 속도가 빠르게 감소하는 이러한 현상을 소프트웨어 엔트로피라고도 한다
- 코드베이스에서 무언가를 변경할 때마다 무질서도(엔트로피)는 증가한다
- 지속적인 정리와 리팩터링 등과 같은 관리를 하지 않고 방치하면 시스템이 점점 더 복잡해지고 무질서해진다
테스트가 있는 프로젝트
- 테스트는 안전망 역할을 하며, 대부분의 회귀에 대한 보험을 제공하는 도구라 할 수 있다
- 테스트는 새로운 기능을 도입하거나 새로운 요구 사항을에 더 잘 맞게 리팩터링한 후에도 기존 기능이 잘 작동하는지 확인하는데 큰 도움이 된다
- 단점은 초반에 상당한 노력이 필요하다는 것
- 그러나 프로젝트 후반에도 잘 성장할 수 있도록 하므로 장기적으로 보면 그 비용을 메울 수 있다
- 코드베이스를 지속적으로 검증하는 테스트 없이는 개발이 쉽게 확장되지 않는다
- 지속성과 확장성이 핵심이며 이를 통해 장기적으로 개발 속도를 유지할 수 있다
회귀
회귀는 특정 사건(일반적으로 코드 수정)후에 기능이 의도한 대로 작동하지 않는 경우다. 소프트웨어 버그와 회귀라는 용어는 동의어이다
2.1 좋은 테스트와 좋지 않은 테스트를 가르는 요인
- 단위 테스트가 프로젝트 성장에 도움이 되는것은 맞지만 테스트를 작성하는 것만으로는 충분하지 않다
- 좋지 않은 테스트는 테스트가 부재한 프로젝트와 비교하여 초반에 코드가 나빠지는 것을 늦출 수 있지만 거시적 관점에서 큰 차이가 없다
- 좋지 않은 테스트는 잘못된 경고가 발생하고, 버그를 발견하는데 도움이 되지 않으며, 유지 보수가 어렵고 느리다
- 이러한 테스트를 더 많이 실행하더라도 단위 테스트의 목표를 달성할 수 없다
- 지속 가능한 프로젝트 성장을 위해서는 고품질 테스트에만 집중해야 한다. 이러한 테스트만이 테스트 스위트 에 남을 만한 테스트 유형이다
3 코드 커버리지
- 테스트 스위트의 품질 측정을 위해 코드 커버리지 지표를 사용하기도 한다
- 일반적으로 커버리지 숫자가 높을수록 더 좋다
- 하지만 코드 커버리지는 중요한 피드백을 주더라고 테스트 스위트 품질을 측정하는데 사용할 수 없다
- 코드 커비리지가 성공적인 테스트 스위트를 보장하지 않기 때문에 개발자 스스로 좋은 테스트를 구별할 줄 알아야한다
- Code-Coverage.md의 Code Coverage와 테스트 스위트의 품질 참고
4 좋은 테스트 스위트의 특성
4.1 개발 주기에 통합돼 있다
- 모든 테스트는 개발 주기에 통합돼야 한다
- 테스트를 빌드 시스템에 통합한다
- 이상적으로는 코드가 변경될 때마다 아무리 작은 것이라도 실행해야 한다