2010-05-28 3 views
4

MongoDb 데이터베이스에 문서를 저장하는 단위 테스트가 실행 중입니다. 이 단위 테스트가 성공하려면 MongoDb 서버를 시작해야합니다. Process.Start ("mongod.exe")를 사용하여이 작업을 수행합니다.유닛 테스트 및 MongoDb 서버 시작

작동하지만 때로는 시작하는 데 시간이 걸리고 심지어 시작하기 전에 단위 테스트가 실행을 시도하고 실패합니다. 단위 테스트가 실패하고 mongodb 서버가 실행되고 있지 않다고 불평합니다.

그런 상황에서해야 할 일은 무엇입니까?

답변

1

실행 후 지연이있는 루프에서 빠른 테스트 쿼리를 실행할 수 없으며 계속 진행하기 전에 DB가 작동하는지 확인할 수 있습니까?

+0

모든 단일 단위 테스트를 실행하기 전에 테스트 쿼리를 실행 하시겠습니까? – azamsharp

+0

아니요, 데이터베이스를 다시 시작한 후 UnitTests가 시작되기 전에 데이터베이스가 실행 중임을 알 수 있습니다. 나는 그것을 데이터베이스를 시작하는 동일한 루틴에 포함시키는 것을 의미합니다. –

+0

데이터베이스를 시작하면 무슨 뜻인지 이해가 안됩니다! 데이터베이스가 없습니다. 그것은 시작할 서버가 필요한 MongoDb 데이터베이스입니다. 서버를 시작한 후에 지연 될 수 있지만 이상하게 보입니다! – azamsharp

4

외부 리소스 (DB, 웹 서버, FTP, 백업 장치, 서버 클러스터)를 테스트에 사용하는 경우 오히려 통합 테스트를 한 다음 단위 테스트를 수행하십시오. 테스트에서 모든 외부 리소스를 시작하는 것이 편리하지 않고 실용적이지 않습니다. 테스트가 예측 가능한 환경에서 실행되는지 확인하십시오. 테스트를 실행하기 전에 MongoDB를 시작 스크립트

  1. 실행 테스트 스위트 (BAT, NANT, WSC) : 그것을 할 방법은 여러 가지가 있습니다.
  2. 서버에서 MongoDB를 시작하고 절대로 을 종료하지 마십시오.

은 외부 자원이 시작될 때까지 기다려야 당신의 검사 결과에 지연 어떤 루프를 추가하지 마십시오 - 그것은 테스트를하게 느린 불규칙하고 매우 복잡한.

1

나는 (내가 말했듯이 이것은 내가 한 일이지만, 누군가가 더 좋은 아이디어를 가지고 있음을 의미한다) 다양한 단계에서 여러 가지 일을 할 수있는 일종의 MongoTestHelper를 작성한다. 너의 시험들.

테스트가 실행되기 전에 테스트 mongod 인스턴스가 실행 중인지 확인하고, 그렇지 않으면 좋아하는 테스트 - 몽고 포트에서 부팅합니다. 실제로 새로운 mongod 인스턴스를 부팅하고 부팅하는 것이 비용이 많이 들지는 않으며 이미 해당 포트가 사용 중일 때 실패하게 만듭니다. 그러나 이것은 Windows에서 매우 다르므로 포트가 열려 있는지 확인해야 할 수도 있습니다.

테스트하기 전에 필요한 모든 종류의 모든 테스트 된 컬렉션에서 모든 항목을 제거 할 수 있습니다.

for (String name : mongo.getDatabaseNames()) { 
    mongo.dropDatabase(name); 
} 

을 테스트 당신이 임의의 포트에 부팅 선택한 경우 당신은 항상 그것을 차단 될 수 있습니다 실행 한 후 : 아름다운 MongoDB를 당신을 위해 다시 작성하므로 사실, 난 그냥, DBS를 드롭 모든 ,하지만 그건 좀 어리석은 것처럼 보입니다. 인생은 너무 짧습니다.

+0

그래, 이미 그 모든 일을하고 있습니다! 어쨌든 데이터베이스 나 컬렉션을 삭제할 때 조심해야 할 것은 컬렉션에 만들어진 모든 인덱스가 손실된다는 것입니다. 나는 보통 모든 컬렉션을 거치며 컬렉션이나 데이터베이스를 삭제하는 대신 개별 레코드를 삭제합니다. – azamsharp

2

사실은 쉽게 :) ... 그냥 서비스로 MongoDB를 실행합니다
그것은 당신이 시작하는 서비스를받을 수있는 몇 가지 레지스트리 설정으로 바이올린을 일부 운영 체제의 제외 슈퍼 쉽게 How to run MongoDB as Windows service?

, 당신은 검색 할 수 있습니다 이 바이올린에 관한 기사를 찾아보십시오. 도움이 필요하면 알려주세요.

0

TDD purists는 외부 리소스를 시작하면 단위 테스트가 아니라고 말합니다. 대신 데이터베이스 인터페이스를 조롱하고 클래스를 테스트하십시오. 실제로 이것은 코드를 mockable로 변경하는 것을 의미 할 것이며 이것은 틀림없이 좋은 것입니다.

OTOH의 경우 통합 또는 승인 테스트를 작성하려면 다른 사람이 언급 한 것처럼 테스트 데이터가 포함 된 메모리 내 일시 데이터베이스를 사용해야합니다.

+0

TDD가 아닌 "단위 테스트 순수 주의자"라고 말하고 싶습니다. TDD 각도를 좀 더 실용적인 것으로 생각합니다. 코드가 MongoDB에서 작동하는지 확인해야한다면 MongoDB에 대한 쿼리를 테스트해야합니다 – sMoZely