TIL

6.2 고립된 단위 테스트

가장 편하고 좋은 테스트 방법은 가능한 작은 단위로 쪼개서 테스트 하는 것이다.

작은 단위의 테스트가 좋은 이유는

하지만 작은 단위로 테스트하고 싶어도 테스트 대상이 다른 오브젝트와 환경에 의존하고 있다면 작은 단위로 테스트 하기 어렵다.

복잡한 의존 관계 속의 테스트

UserService를 생각해 보자. 해당 클래스가 비즈니스 로직을 수행하기 위해서는 MailSender라는 외부 API를 사용하는 오브젝트와 UserDao를 의존해야 한다고 가정하겠다. 여기다가 트랜잭션 경계 설정을 위한 TransactionManager까지 포함하면 총 3개의 오브젝트들과 커뮤니케이션 해야 한다.

UserService를 테스트하려면 이 세 가지 오브젝트들이 같이 실행될 뿐만 아니라 UserDao를 통해 DataSource를 비롯한 DB 관련 네트워크 통신까지 전부 함께 실행 된다. MailSender에 의해 외부 API까지 날린다고 하면 더 무거운 작업이다.

이런 경우의 문제점은 다음과 같다.

테스트 대상 오브젝트 고립시키기

따라서 테스트 대상이 다른 의존 관계에 종속되고 영향 받지 않도록 고립시킬 필요가 있다. 이는 바로 테스트 대역을 사용하는 것이다.

고립된 테스트를 하면 테스트 대상이 다른 의존 대상에 영향 받지 않아 준비도 간단해진다. 뿐만 아니라 테스트 속도도 크게 향상된다.

고립된 테스트를 만들기 위한 목 오브젝틑 작성은 약간의 수고가 들어가지만 보상을 충분히 기대할만 하다.

단위 테스트와 통합 테스트

단위 테스트의 단위는 사용자가 정하기 나름이다. 기능 전체를 단위라고 볼 수도 있고 클래스나 메서드를 단위라고 볼 수도 있다. 여기서는 이전의 대상 클래스를 대역을 사용해서 고립시켜 하는 테스트도 단위 테스트라고 정의하겠다. 또 다른 계층의 오브젝트나 DB 등의 리소스가 참여하는 테스트를 통합 테스트라고 하겠다. 스프링의 테스트 컨텍스트 프레임워크를 이용한 테스트도 통합 테스트다.

단위 테스트와 통합 테스트 선정 기준 가이드라인