제목: [TDD] 단위 테스트(Unit Test) 작성의 필요성 (1/3)
작성자: tistory"망나니개발자"
작성자 수정일: 2021년04월20일
링크: https://mangkyu.tistory.com/143
작성: 2022년 2월 21일
단위테스트는 하나의 모듈을 기준으로 독립적으로 진행되는 가장 작은 단위의 테스트이다.
즉, 단위 테스트는 애플리케이션을 구성하는 하나의 기능이 올바르게 동작하는지를 독립적으로 테스트하는 것으로, "어떤 기능이 실행되면 어떤 결과가 나온다" 정도로 테스트를 진행한다.
통합 테스트는 모듈을 통합하는 과정에서 모듈 간의 호환성을 확인하기 위해 수행되는 테스트이다.
일반적으로 어플리케이션은 여러 개의 모듈들로 구성이 되고, 모듈들끼리 메세지를 주고 받으면서 기능을 수행한다.
그렇기에 통합된 모듈들이 올바르게 연계되어 동작하는지 검증이 필요한데, 이러한 목적으로 진행되는 테스트가 통합 테스트이다.
그렇기에 통합 테스트는 독립적인 기능에 대한 테스트가 아니라 웹 페이지로부터 API를 호출하여 올바르게 동작하는 지를 확인하는 것이다.
실무에서 테스트 코드를 작성한다고 하면 거의 단위 테스트를 의미한다.
통합 테스트는 실제 여러 컴포넌트들 간의 상호작용을 테스트하기 때문에 모든 컴포넌트들이 구동된 상태에서 테스트를 하게 된다.
그렇기에 통합 테스트를 위해서는 캐시나 데이터베이스 등 다른 컴포넌트들과 실제 연결을 해야 하고, 시스템을 구성하는 컴포넌트들이 많아질수록 테스트를 위한 비용(시간)이 상당히 커진다.
반면에 단위테스트는 해당 부분만 독립적으로 테스트학 ㅣ때문에 어떤 코드를 리팩토링하여도 빠르게 문제 여부를 확인할 수 있다.
실제로 실무에서는 단위테스트를 선호하며, 요즘 많이 사용되는 TDD(Test-Driven Development, 테스트 주도 개발) 에서 이야기 하는 테스트도 단위테스트를 의미한다. 테스트 코드를 수시로 빠르게 돌리면서 문제를 파악할 수 있다.
어떤 객체가 자체적으로 모든 일을 처리한다면 문제가 없겠지만, 일반적인 어플리케이션에서는 1개의 기능을 처리하기 위해 다른 객체들과 메시지를 주고 받아야 한다.
하지만 앞서 설명하였듯이 단위 테스트는 해당 모듈에 대한 독립적인 테스트이기 때문에 다른 객체와 메세지를 주고 받는 경우에 문제가 발생한다.
그렇기 때문에 다른 객체 대신에 가짜 객체(Mock Object
)를 주입하여 어떤 결과를 반환하라고 정해진 답변을 준비시켜야 하는데, 이를 Stub
이라고 한다.
일반적으로 요구 사항은 계속해서 변하고, 그에 맞춰 우리의 코드 역시 변경되어야 한다.
하지만 실제 코들르 변경한다는 것은 잠재적인 버그가 발생할 수 있음을 내포한다.
또한 실제 코드가 변경되면 테스트 코드 역시 변경이 필요할 수 있는데, 이러한 이유로 우리는 테스트 코드 역시 가독성있게 작성할 필요가 있다.
테스트를 작성하는 경우에는 다음을 준수하는 것이 좋다
또한 좋고 깨긋한 테스트 코드는 FIRST라는 5가지 규칙을 따라야 한다.
실제로 회사의 다른 부서에서 테스트 코드를 작성하는 것을 보았는데, 단위 테스트라는 이름 아래에 Spring의 모든 빈을 띄우는 모습을 볼 수 있었습니다. 작성한 테스트를 실행하는데는 몇 분의 시간이 소요되었고, 이렇게 오랜 시간이 걸리는 테스트를 지켜보면서 단위 테스트의 장점이 빛을 바래는 것을 느낄 수 있었습니다
개인적으로 단위 테스트의 가장 큰 장점은 내가 개발한 것들을 빠르게 검증받는 것이라고 생각합니다. 단위 테스트를 통해 내가 개발한 코드를 바로 검증받고, 테스트를 통과하지 못하면 코드를 수정해 또 다시 빠르게 검증받는 것입니다. 이렇게 테스트를 작성하고 수시로 실행하며 검증하면서 버그를 잡고 개발 비용을 줄어나갈 때 테스트의 가치를 느낄 수 있었습니다.
물론 프로토타입 또는 PoC 성향의 프로젝트라면 단위 테스트를 작성하지 않을 수도 있습니다. 반면에 신규로 개발된 프로젝트이거나 계속해서 기능이 추가되고 유지보수가 필요한 프로젝트라면 단위 테스트를 작성하는게 좋을 것 같습니다. 만약 해당 프로젝트가 이미 구현되어있는 상태라도 늦게나마 단위 테스트를 작성하는 것은 이후에 작업하는데 도움을 줄 것입니다!