문제

NHibernate를 사용하여 데이터베이스의 모든 데이터를 삭제할 수 있습니까?각 단위 테스트를 시작하기 전에 그렇게 하고 싶습니다.현재 데이터베이스를 삭제하고 다시 생성하지만 이는 나에게 허용되는 솔루션이 아닙니다.

==========================================================

네, 결과는 다음과 같습니다.데이터베이스(Postgre)에서 이것을 테스트하고 있습니다.CreateSchema(1), DanP 솔루션(2), apollodude217 솔루션(3)을 테스트하겠습니다.각 방법으로 테스트를 5번 실행하고 평균 시간을 구합니다.

1~10차 테스트
(1) - ~26초
(2) - 9,0초
(3) - 9.3초

2라운드 - 100개 테스트
(1) - 어서, 내 컴퓨터에서는 그런 일을 하지 않겠습니다
(2) - 12.6초
(3) - 18.6초

더 많은 테스트를 통해 테스트할 필요는 없다고 생각합니다.

도움이 되었습니까?

해결책

개인적으로, 저장된 절차를 사용하여 실행 가능한 HQL (자세한 내용은이 게시물을 참조하십시오 : http://fabiomaulo.blogspot.com/2009/05/nh21-executable-hql.html ) )

session.delete ( "객체에서"에서 ""

"

다른 팁

나는 SchemaExport 클래스를 만들고 각 테스트 전에 스키마를 다시 만듭니다.이는 데이터베이스 삭제와 거의 비슷하지만 테이블을 삭제하고 다시 만드는 것뿐입니다.나는 각 테이블에서 모든 데이터를 삭제하는 것이 이보다 빠르지 않고 심지어 더 느릴 수도 있다고 가정합니다.

우리의 단위 테스트는 일반적으로 메모리의 Sqlite에서 실행되며 이는 매우 빠릅니다.이 데이터베이스는 연결이 열려 있는 동안에만 존재하므로 각 테스트마다 전체 데이터베이스가 다시 생성됩니다.빌드 구성을 변경하여 Sqlserver로 전환하고 있습니다.

나는 이것이 더 빠르지 만 각 매핑 된 클래스에 대해 이렇게 할 수 있습니다.

// untested
var entities = MySession.CreateCriteria(typeof(MappedClass)).List<MappedClass>();
foreach(var entity in entities)
    MySession.Delete(entity);  // please optimize
.

이 (혼자)는 not 적어도 2 예에서 작동합니다

  1. 앱이 시작될 때 데이터베이스에 있어야하는 데이터가있을 때
  2. ID 속성이 저장되지 않은 값이 "any"일 때
  3. 를 입력 할 때.

좋은 대안은 초기 DB 상태의 백업을 가지며 테스트를 시작할 때 복원 (DB에 따라 복잡 할 수 있음)

데이터베이스를 다시 생성하는 것은 특히 단위 테스트를 위해 좋은 선택입니다.작성 스크립트가 너무 느려지면 데이터베이스의 백업을 수행하고 각 테스트 전에 DB를 초기 상태로 복원 할 수 있습니다.

데이터베이스의 모든 외래 키를 삭제 한 다음 모든 테이블을 삭제 / 자르는 스크립트를 작성하는 것입니다.그러나 이것은 자동 생성 된 ID 또는 시퀀스를 재설정하지 않습니다.이것은 우아한 해결책처럼 보이지 않으며 확실히 더 많은 시간이 소요됩니다. 어쨌든 이것은 orm rung jue not nhibernate가 아닌 orm을 통해 수행되어야하는 것이 아닙니다.

왜 다시 작성 옵션을 거부합니까?귀하의 요구 사항은 무엇입니까?스키마가 너무 복잡합니까?다른 사람이 데이터베이스를 디자인합니까?파일 조각화를 피하고 싶습니까?

다른 솔루션은 데이터를 닦는 저장 프로 시저를 만드는 것일 수 있습니다.테스트 설정 또는 인스턴스화 메소드는 저장 프로 시저를 먼저 실행합니다.

그러나 데이터베이스의 크기와 삭제할 가능성이있는 행 수를 알지 못하는 다른 방법보다 빠르게되는지 확실하지 않습니다.또한 안전을 위해이 저장 프로 시저를 실시간 서버에 배포하는 것이 좋습니다!

hth

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top