단위 테스트, UnitTest
대부분의 개발자는 지속적인 리팩터링
의 필요성을 인지하고 있으나, 다른 사람이 만든 코드를 리팩터링
하다 발생하는 문제 에 대한 고민 때문에 능동적으로 리팩터링
하는 경우는 많지 않다.
이러한 문제(고민)을 해결 할 수 있는 방법은 크게 다음과 같다.
설계 원칙
과디자인 패턴
에 익숙할 뿐만아니라 비즈니스와 코드에 대한 이해도를 높인다.단위 테스트
를 작성(혹은 분석)한다.
단위 테스트
는 코드의 정확성을 테스트하기 위해 작성한(된)다.
- 테스트 대상은 클래스 또는 함수로 제한되며, 테스트 대상이 예쌍대로 실행되는지 테스트한다.
- 예상되거나 예상치 못한 상황에서 코드가 올바르게 실행될 수 있도록 가능한 모든 정상 및 비정상 상황을 포괄하는 테스트 케이스를 생각하고 설계해야한다.
단위 테스트 코드를 작성하는 이유
단위 테스트 코드
는 코드 품질
을 향상시키는 효과적인 수단이며, 단위 테스트를 작성함으로써 다음과 같은 이점이 존재한다.
프로그래머가 코드에서 버그를 찾는데 도움이 될 수 있다.
버그
가 없는 코드를 작성하는 것은 프로그래머의 능력을 측정하는 중요한 기준이다.
- 매번 코드를 작성할 때마다 완벽한 단위 테스트를 설계하는 것은 중요하다.
- 이러한 과정을 거쳐 낮은 수준의 버그를 수정하는데 드는 불필요한 시간을 절약할 수 있다.
프로그래머가 코드 설계에서 문제를 찾는데 도움이 될 수 있다.
코드에 대한 단위 테스트를 설계하는 데 어려움을 겪고 있고, 단위 테스트 프레임워크의 고급 기능에 의존해야 하는 경우라면 결합성이 높은 코드 처럼 설계가 비합리적임을 의미하는 경우가 많다.
의존성 주입
을 사용하지 않거나전역 변수
와정적 함수
를 많이 사용하고 있는 경우
통합테스트를 보완할 수 있다.
프로그램이 실행될 때 나타나는 버그는 일부 경계조건
과 비정상적인 상황
에서 발생하는 경우가 많다. 그리고 이러한 대부분의 예외는 테스트 환경에서 재현이 매우 어렵다. 이 때 단위 테스트
를 사용하면, 테스트 환경의 부족한 부분을 보완 할 수 있다.
Mock
을 사용하여 반환 값을 제어하고 비정상적인 상황을 재현하여 해당 상황에서의 코드 실행 결과를 테스트 할 수 있다.
단위 테스트 코드를 작성하는 과정은 코드 리팩터링 과정에 해당한다.
모든 상황에 대해 명확하게 단위 테스트
코드를 작성하는 것은 어렵지만, 분명한 것은 단위 테스트
를 작성하는 것이 현장에서 지속적인 리팩터링을 수행하는 효과적인 방법이다.
단위테스트
를 작성함으로써, 코드를 다시 검토할 수 있다.테스트 용이성
이 낮은 것과 같은코드 설계상의 문제점
을 찾아 낼 수 있다.- 경계 조건의 부적절한 처리와 같은
코드 작성 문제
를 리팩터링 할 수 있다.
프로그래머가 코드를 빠르게 익숙해지도록 도와준다.
코드를 읽기 전, 비즈니스 배경
과 코드 설계 사상
을 이해하는 것이 도움이 되지만 일부 개발자는 문서
를 작성하고 주석
을 추가하는 것을 싫어하여 코드의 가독성
이 떨어지고 이해하기 어려운 코드가 되기 쉽다.
이 경우 단위 테스트
가 문서
와 주석
의 역할을 대신할 수 있다.
- 단위 테스트 사례는 코드가 수행하는 작업과 사용 방법을 반영하는
사용자 사례
에 해당한다. - 단위 테스트를 사용하면 코드가 구현하는 내용, 고려해야 할 특별한 경우, 처리해야 하는
경계 조건
을 알기 위해 코드를 깊이 읽을 필요가 없어지게 된다.
단위 테스트를 설계하는 방법
단위 테스트는 코드에 대한 다양한 입력
, 예외
, 경계 조건
을 다루는 테스트 케이스
를 설계하고 테스크 케이스를 코드로 변환하는 프로세스이다. 이와 관련하여, 단위 테스트를 설계하는 방법
을 중심으로 내용을 알아두면 유용하다.
이전에 작성한 단위 테스트를 재활용하여 작성한다.
단위 테스트 코드는 구현이 간단하고 설계를 고려할 필요가 없기 때문에 작성에 많은 시간이 필요하지 않다. 뿐만아니라 테스트 케이스에 따라 그 구현 방식이 거의 비슷한 경우가 많으므로 새로운 단위 테스트를 작성할 때 기존의 단위 테스트 코드를 재활용할 수 있다.
테스트 케이스가 가능한 모든 가능한 케이스, 특히 일부 특별한 케이스를 포함하는지 주의를 기울인다.
단위 테스트의 품질을 평하가는 기준 중 테스트 커버리지
를 이야기 할 수 있다. 하지만 이는 단위 테스트 품질의 척도로 사용하는 것은 비합리적이다. 커버리지
에 집중하기 보다는 테스트 케이스가 모든 발생 가능한 케이스, 특히 일부 특별한케이스(엣지케이스)를 포함하도록 주의를 더 기울여야 한다.
- 단위 테스트 커버리지에 집중하다보면, 커버리지를 개선하기 위해 불필요한 테스트 코드를 많이 작성할 수 있다.
- 일반적으로 프로젝트의 단위 테스트 커버리지가
60~70%
에 도달하면 운영 서버에 배포해도 문제가 없다.
단위테스트는 테스트 중인 함수의 특정 구현 논리에 집중하지 않으며, 그 기능에만 초점을 맞춘다.
단위 테스트를 작성할 때에는 코드의 구현 논리를 이해하는 것이 불필요하다. 오히려 특정 구현을 검증할 경우, 깨지기 쉬운 테스트가 된다.
- 코드의 구현 논리 자체에 대한 단위 테스트를 작성할 경우, 코드가 리팩터링되었을 때 외부적인 동작이 변경되지 않았음에도 코드의 논리가 변경되었을 경우 단위 테스트가 실패하게 된다.
- 단위 테스트는 행위 를 검증하는 것이 아닌, 상태를 검증해야 한다.(때에 따라 행위를 검증해야 할 때도 존재한다.)
'개인공부' 카테고리의 다른 글
[ 개인 공부 ] 리팩터링(Refactoring)에 관하여 (0) | 2023.10.30 |
---|---|
[ 개인공부 ] DRY 원칙 (0) | 2023.10.25 |
[ 코드 설계 ] 의존성 역전 원칙 과 의존성 주입 프레임 워크 (0) | 2023.10.06 |
[ 코드 설계 ] 개방 폐쇄 원칙 OCP (0) | 2023.09.28 |
[ 코드 설계 ] 단일 책임 원칙 SRP (0) | 2023.09.26 |