Effective UnitTest
Effective UnitTest
좋은 단위 테스트의 특성은 아래와 같다.
- 개발 주기에 통합돼 있다.
- 실제로 사용하는 테스트에만 가치가 있다. 그렇지 않으면 작성해도 의미가 없다.
- 코드베이스의 가장 중요한 부분만을 대상으로 한다.
- 최소한의 유지비로 최대 가치를 끌어낸다.
- 가치 있는 테스트를 작성해야 한다.
- 유지 보수가 쉽다.
- 가독성이 좋다.
단위 테스트는 코드에서 버그를 찾는데 도움을 준다.
단위 테스트는 코드 설계에서 문제를 찾는데 도움이 될 수 있다. 단위 테스트 설계가 어려운 코드, DI 를 사용하지 않고 전역 변수와 정적 함수를 많이 사용하고 결합성이 높은 코드라면 설계가 비합리적일 수 있음을 의심해야 한다.
단위 테스트는 통합 테스트를 보완하는 강력한 도구다. 네트워크 타임 아웃, 일부 경계 조건 등 재현이 어려운 경우가 있다. 이 경우 MOCK 을 사용하여 비정상적인 상황을 재현하여 해당 상황에서의 코드 실행 결과를 테스트할 수 있다.
MOCK 은 코드가 외부 시스템, 데이터 베이스, 네트워크, 파일 시스템과 같이 제어할 수 없는 구성 요소에 종혹되는 경우, 이 종속 관계를 끊을 수 있도록 도와준다. MOCK 은 실제 서비스를 모의 서비스로 대체하는 것을 말한다. 단위 테스트를 작성하는 과정은 코드 리패터링 과정에 해당한다. 단위 테스트는 지속적인 리팩터링을 수행하는 효과적인 방법이다.
단위 테스트는 정책 등의 문서화의 역할을 한다.
단위 테스트는 TDD 를 개선하고 대체할 수 있다. TDD 는 실제로 거의 사용되지 않는 개발 방법론이다. 코드를 먼저 작성하고, 이에 맞춰 단위 테스트를 설계하고, 리팩터링 하는 개발프로세스가 더 친숙하고 프로그래머들이 쉽게 수용할 수 있다.
단위 테스트는 코드의 구현 논리에 의존하지 않는다. 그 기능에만 초점을 맞춘다. 높은 커버리지를 추구하기 위해서 코드를 한줄 씩 따라가면서 구현 논리 자체에 대한 단위 테스트를 설계하는 경우, 외부적인 동작이 변경되지 않았음에도 코드의 구현 논리가 변경되었다면 단위 테스트가 실패하게 된다.
设计模式之美 / 王争