단위테스트를 한다는 어떤 단위인건가요?

2014-07-02 21:38

TDD라는 걸 별로 생각할 겨를도 없이 개발을 하다가.. 나도 바꿔보자라는 생각으로 TDD라는 걸 해보려고 합니다. 대략적은 JUnit의 방법은 잘 알겠는데.. 단위를 어떻게 잡는 것이 맞는지가 개념이 부족하네요. 단위테스트라는 건 결국 Method 테스트인가요? 컨트롤러의 메소드, 서비스의 메소드, DAO의 메소드를 각각 분리해서 테스트 해야하는 것이 정석인건가요? 서비스에서 DAO의 특정 메소드를 호출하는 메소드가 존재할 때 단위테스트의 범위는 서비스내의 메소드에 국한되고, 그 테스트 메소드안에서 호출되는 DAO메소드는 해당사항이 없거나, 목업데이터로 처리하는 하는 것이 맞는 건가요?

이렇게하면 테이터의 변경의 따른 예외 조건들에 대해서는 체크하는 것이 힘들 것 같은데.. 이렇게 하는 것이 맞는 건지?

그리고 특정 컨트롤러를 호출해서 DAO까지 모두 검증하는 테스트는 통합테스트 인가요? 개념이 잘 안서네요..

2개의 의견 from SLiPP

2014-07-05 13:12

단위테스트의 범위는 서비스내의 메소드에 국한되고, 그 테스트 메소드안에서 호출되는 DAO메소드는 해당사항이 없거나, 목업데이터로 처리하는 하는 것이 맞는 건가요? 단위 테스트라고 하면 다른 객체와 연관 관계를 가지고 있는 단일 작업 단위를 테스트하는 것이라고 볼 수 있습니다. 위 글과 같이 Service에서 DAO와 연관관계를 가질 경우 DAO에 대한 단위테스트가 별도로 존재하고, Service는 DAO 내부까지 테스트하지 않고 Service 내의 method에 집중해서 테스트하는 것이 맞겠죠.

만약 Service와 DAO를 같이 테스트하는 경우 이를 통합테스트라고 볼 수 있습니다. working effectively with legacy code와 같은 책에서는 DAO와 같이 데이터베이스와 같은 외부 자원과 의존관계에 있는 로직을 테스트하는 것도 단위 테스트가 아니라고 정의하고 있어요. 이건 바라보는 개발자의 관점에 따라 달라질 수도 있을 듯해요.

이렇게하면 테이터의 변경의 따른 예외 조건들에 대해서는 체크하는 것이 힘들 것 같은데.. 이렇게 하는 것이 맞는 건지? 데이터의 변경에 따른 예외 조건들은 DAO에서 반환되는 값에 따라 결정되는 것이잖아요. 이 같은 테스트를 DB에 의존하지 않고 테스트가 가능하도록 mockito, jmock과 같은 테스트 프레임워크가 있어요. 이런 프레임워크를 활용하면 DB에 의존하지 않은 상태에서도 테스트할 수 있어요. 직접 학습해 보시면 대충 감이 잡힐겁니다.

그리고 특정 컨트롤러를 호출해서 DAO까지 모두 검증하는 테스트는 통합테스트 인가요? 통합 테스트 또는 기능 테스트라고 볼 수 있겠네요. 어느 범위까지 테스트하느냐에 따라서요. 화면에서 사용자가 직접 서비스를 사용하는 단위로 테스트하는 것은 인수(acceptance) 테스트라고 합니다.

시작 단계부터 용어에 집중하지 마시고 일단 한번 다양한 테스트 도구를 활용해 테스트하다보면 대략적인 감이 잡힐 겁니다.

의견 추가하기

연관태그

← 목록으로