2010-02-14 7 views

답변

2

I을 테스트를 실행할 수 있습니다 단위는 꽤 종교적으로 내 저장소를 테스트합니다. 아마도 아마도 실제로 가장 중요한 단위 테스트 일 것입니다.

NHibernate와 같은 ORM을 사용하면 실제로는 꽤 어려울 수 있습니다.

메모리에서 sqlite db를 생성하고 각 테스트가 끝날 때이를 파괴하는 설정 및 해체가 포함 된 기본 고정구를 사용합니다. 이것은 놀라 울 정도로 빠릅니다. 그런 다음 각 저장소에 대해 테스트를 위해 테스트 데이터를 주입하는 설정이 있습니다. 이것은 매우 독립적이며 내 저장소 쿼리의 모든 논리 문제를 포착합니다.

유일한 catch는 db 공급자 특정 경우이지만, NHibernate와 같은 것을 사용할 때는 일반적으로 예외입니다.

데이터베이스 특정 쿼리를 테스트하는 특별한 경우에는 다른 설정 및 해제 방법을 사용하는 테스트 집합이 필요할 수 있습니다. 불행히도 이러한 테스트는 다른 단위 테스트보다 느리고 가능성이 있습니다 (그 이유는 함께 그룹화해야하는 이유입니다).

테스트중인 데이터베이스 소프트웨어의 "빠른"버전을 사용할 수있는 경우 데이터베이스가 즉시 실행되도록 설정하여 테스트가 실행되는 데이터베이스가 예상 한 스키마를 유지하도록 항상 권장하는 것이 좋습니다. 나는 이것의 설정과 해체의 한 부분을 바꿀 것이다. 나는 전체 테스트 실행의 시작과 끝에서만 데이터베이스를 설정하고 해체했습니다. 그런 다음 모든 테스트 설정과 해체는 트랜잭션을 시작한 다음 끝에 롤백해야합니다. 이것은 테스트 사이에 구획화 된 것을 유지하는 빠른 방법입니다. 마지막으로 원하는 것은 한 테스트의 데이터가 다른 테스트에 영향을주는 것입니다.

+0

나는 Hibernate (Java)를 사용하지만 내 응용 프로그램은 다른 서버에서는 사용할 수없는 몇 가지 오라클 특정 명령문을 활용하기 위해 여러 원시 SQL을 사용합니다. –

+0

필자는 과거에 내가 필요로했던 것에 대한 정보를 추가했습니다. 메모리 테스트뿐만 아니라 특정 sb를 사용하십시오. 나는 더 많은 일을하기 때문에 그렇게하지 않는 것을 선호하지만 상대적으로 고통없이 할 수 있습니다. – mockobject

2

예 - 메모리 데이터베이스 (예를 들어 HSQLDBL)와

This blogpost of mine 비슷한 주제에 대해 설명합니다.

업데이트 : 귀하의 의견에 대해 - ORM을 사용하여 데이터베이스 불일치가 문제되지 않는지 확인했습니다. 원시 SQL로 작업하는 것은 처음에는 그리 좋은 생각이 아닙니다 (OOP로 작업하는 경우). 그런 다음 가능한 한 ANSI SQL로 사용하려고 시도 할 수 있습니다 (불일치를 테스트하지 않음).

또 다른 옵션은 테스트 데이터베이스 서버 + 연속 통합 엔진을 전용하고 (여러 시스템에서 여러 테스트 실행이 서로 혼란을하지 않도록)에만 엔진 내에서

+0

대부분의 RDBMS 서버는 SQL을 처리하는 방식이 서로 다르기 때문에 인 메모리 (in-memory) DB에서 작동했기 때문에 프로덕션 서버에서 작동하는지, 그리고 그 반대인지 어떻게 확인할 수 있습니까? –

+0

모든 것이 제대로 작동하는지 확인하려면 통합 테스트 –

+0

에 대한 답변이 필요합니다.그러나 ANSI SQL 만 사용하는 것은 옵션이 아닙니다. : ( –

0

DAO 레이어에 대한 단위 테스트는 필수입니다. 자바에서는 dbUnit 같은 프레임 워크가 도움이됩니다. 일부 부트 스트랩 데이터로 데이터베이스에 별도의 스키마/인스턴스를 유지하면 적절한 단위 테스트를 수행하고 대부분의 시나리오를 처리 할 수 ​​있습니다.

관련 문제