2012-03-21 4 views
14

"외부 컨테이너"테스트를 위해 유닛 테스팅 DAO 클래스에서 사용하는 EasyMock 및 튜토리얼/예제를 살펴 보았습니다. 그러나 나는 그들 중 대다수가 DAO 클래스를 조롱하면서 서비스 레이어를 테스트하는 것에 대해 이야기한다고 생각한다. 나는 다소 혼란 스럽다. DAO 레이어를 어떻게 테스트 할 것인가?DAO 유닛 테스팅

일부 사람들은 DB & EJB와 상호 작용하는 테스트가 실제로는 통합 테스트가 아니라 단위 테스트가 아니라는 것을 알고 있지만 SQL이 올바른지 (ORM이 없다고 가정) DAO가 자신의 올바른 데이터를 삽입/쿼리하는지 어떻게 알 수 있습니까? 실제 (실제 데이터베이스와 유사한 로컬 데이터베이스 읽기) 데이터베이스입니까?

DBUnit은 이러한 상황에 대한 해결책이라고 읽었습니다. 하지만 내 질문은 "외부 컨테이너"DBUnit 같은 프레임 워크를 사용하는 것입니다. DAO가 일부 EJB에 의존하는 경우, 트랜잭션을 처리하는 방법, 삽입에서 다른 테이블을 업데이트하는 트리거가있는 경우 어떻게 될까요?

이러한 종속성이있는 DAO 만 유닛 테스트하는 가장 좋은 방법은 무엇입니까?

답변

23

개인적으로 필자는 일종의 테스트 데이터베이스를 사용하여 개인적으로 DAO를 테스트합니다. 앱에서 프로덕션 환경에서 사용하는 것과 동일한 유형의 데이터베이스 (SAME 데이터베이스가 아님)를 사용하는 것이 좋습니다.

만약 당신이 그렇게한다면, 테스트는 실행중인 데이터베이스에 대한 의존성을 가지고 있기 때문에 더 많은 통합 테스트라고 생각합니다. 이 접근법은 실행중인 프로덕션 환경에 가능한 한 근접한 점에서 이점이 있습니다. 테스트 구성이 필요하다는 단점이 있고 실행중인 테스트 데이터베이스 (시스템의 로컬 또는 사용자 환경의 어딘가)가 필요하며 테스트를 실행하는 데 시간이 오래 걸릴 수 있습니다. 또한 테스트가 실행 된 후에 테스트 데이터를 롤백해야합니다.

일단 DAO가 테스트되면 서비스를 단위 테스트하도록 조롱하십시오.

1

Dao 및 서비스 API 테스트를 위해 HSQLDB를 사용하고 있습니다. 성능이 좋으며 트랜잭션도 지원합니다. 나는 EJB를 사용하지 않는다. 나는 최대 절전 모드를 사용한다.

다른 데이터베이스에서 테스트를 실행하면 지원되는 데이터베이스 문제가 일부 해소 될 수 있음을 알고있는 몇 가지 문제점이 있습니다. 그러나 그러한 문제는 연기에 잡혀 야한다고 생각합니다. & 수용 테스트.

관련, 고야의 DAO와 일반적으로

12

아이디어는 데이터 액세스 코드 주위에 최소한의 래퍼를 가지고, 그래서 아무것도 데이터베이스에 매핑을 제외하고 테스트가 없다, 그리고 모의 객체와 단위 테스트가 쓸모 . DAO에서 mock으로 테스트 할 가치가있는 로직이 실제로 존재한다면 DAO 패턴을 오용하고 논리가 서비스에 있어야한다는 주장이 제기 될 수 있습니다.

DBUnit 데이터베이스에 매핑을 테스트하는 것은 테스트 전에 시작 데이터 집합을 지정하여 테스트가 알려진 상태에서 시작하고 데이터의 끝 상태를 지정하도록 허용하기 때문에 유용합니다 따라서 예상되는 결과가 무엇인지 주장하는 많은 단위 테스트 코드를 작성할 필요가 없습니다.

데이터베이스를 추상화하는 Hibernate와 같은 도구가 있다면 이상적으로 H2 또는 HSQLDB와 같은 메모리 내장 데이터베이스를 사용하여 테스트 할 수 있으므로 테스트를 빠르게 실행할 수 있으며 만들 데이터베이스가 없습니다. 실제 데이터베이스를 사용해야하는 경우 테스트에 영향을주지 않고 다른 프로세스의 영향을받지 않고 데이터를 만들고 삭제할 수 있도록 테스트가 수행되도록하십시오. 실제로 로컬과 CI 환경 모두에서 자신에게 데이터베이스를 사용하는 것은 거의 불가능하며 인 메모리 데이터베이스를 사용하는 것이 훨씬 실용적입니다.

1

살아있는 데이터베이스와 함께 컨테이너 외부에서 실행할 수있는 단위 테스트를 작성하고 트랜잭션 지원을 위해 독립 실행 형 트랜잭션 관리자 (Bitronix)를 사용하도록 궁극적으로 해결 했으므로 롤백 할 수도 있습니다. 나는 이것이 시험을하지 않는다고 생각합니다 순수 단위 시험은 여전히 ​​... 당신의 의견을 듣는 것을 좋아할 것입니다.

2

Koya answers를 보완하면 DAO 테스트에 HSQLDB를 사용할 수 있습니다. 나는 당신이 당신의 프로젝트에서 Spring과 Hibernate를 사용한다고 상상한다. HSQLDB를 가리 키기 위해 별도의 설정 파일이 필요합니다. 테스트를 실행하기 전에 데이터를 삽입해야합니다. HSQLDB로 할 수있는 것에는 몇 가지 제한이 있지만 일반적으로 쿼리와 조인으로는 괜찮습니다. 이 솔루션을 사용하면 젠킨스와 같은 지속적인 환경에서 사용할 수 있습니다. 통합 테스트에서 HSQLDB를 사용할 수 있으므로이 부분은 조롱을받지 않습니다.