7. 아키텍처 요소 테스트하기

테스트 피라미드

기본 전제는 비용이 적고, 유지보수하기 쉽고, 빨리 실행되고, 안정적인 작은 크기의 테스트들로 높은 커버리지를 유지하는 것이다. 다음의 그림은 몇 개의 테스트와 어떤 종류의 테스트를 목표로 해야 하는지 결정하는데 도움을 준다.

Untitled

여러 개의 단위와 단위를 넘는 경계, 아키텍처 경계, 시스템 경계를 결합하는 테스트는 비용이 크고, 실행은 느려지;며 깨지기 쉬워진다. 테스트 피라미드는 테스트가 비싸질수록 테스트 커버리지 목표를 낮게 잠아야 함을 보여준다. 그렇지 않으면 새로운 기능을 만드는 것보다 테스트를 만드는데 더 많은 시간을 쓰게 된다.

단위테스트는 피라미드의 토대에 해당한다. 일반적으로 하나의 클래스를 인스턴스화하고 해당 클래스의 인터페이스를 통해 기능들을 테스트한다. 만약 테스트 중인 클래스가 다른 클래스에 의존한다면 이는 목으로 대체한다.

피라미드의 다음 계층은 통합테스트다. 이 테스트는 연결된 여러 유닛을 인스턴스화하고 시작점이 되는 클래스의 인터페이스로부터 데이터를 보낸 후 유닛들의 네트워크가 기대한대로 동작하는지 검증한다. 이 책에서 정의한 통합 테스트에서는 두 계층 간의 경계를 걸쳐서 테스트할 수 있으므로 객체 네트워크가 완전하지 않거나 어떤 시점에는 목을 대상으로 해야 한다.

마지막으로 시스템 테스트는 애플리케이션을 구성하는 모든 객체 네트워크를 가동시켜 특정 유스케이스가 전 계층에서 잘 동작하는지 검증한다. 시스템 테스트 위에는 애플리케이션의 UI를 포함하는 엔드투엔드 테스트가 있을 수 있다. 하지만 이 책에서는 백엔드 아키텍처만을 논의하므로 이는 고려하지 않도록 하자.

단위 테스트로 도메인 엔티티 테스트하기

구현한 코드는 특정 상태의 Account 객체를 만들고, withdraw 메소드를 호출해 출금 성공 여부를 검증하고 부수효과들이 잘 일어났는지를 확인하는 단순한 단위 테스트다.

이는 이해하는 것도 쉽고, 실행도 아주 빠르다. 테스트는 이보다 간단할 수 없다. 이런 식의 단위 테스트가 도메인 엔티티에 녹아 있는 비즈니스 규칙을 검증하기에 가장 적절하다. 도메인 엔티티의 행동은 다른 클래스에 거의 의존하지 않기 때문에 다른 종류의 테스트는 필요하지 않다.