사용 사례 : 대규모 (레거시) 시스템에서 사용되는 상당히 큰 데이터베이스 (약 200 개의 테이블)가 있습니다. 전체 데이터베이스를 정의하는 하나의 edmx 파일을 사용하여 데이터베이스 우선 접근 방식으로 구현됩니다. 우리는 자동 테스트를 위해 XUnit과 노력을 사용하고 있습니다. 문제는 이러한 테스트가 매우 느리다는 것입니다. 테스트 범위가 원하는 위치에 있지 않더라도 현재 테스트 스위트를 실행하는 데 7-8 분 정도 걸립니다.
edmx 파일의 작은 하위 집합을 만들면 필요하지 않은 일부 테이블을 제거하여 테스트가 더 빨리 실행됩니다.
특정 테스트 또는 일련의 테스트를 위해 필요한 테이블의 하위 집합 만 만들 수있는 솔루션을 찾고 있습니다 (많은 경우 하나의 테이블 만 필요하다고 생각합니다).
현재 우리는 다음과 같이 연결을 설정하고 있습니다 :
connection = EntityConnectionFactory.CreateTransient("metadata=res://entities.csdl|res://entities.ssdl|res://entities.msl");
런타임에서 XML 변환을 실행하는 등의 방법이 있습니까? Effort가 정의한 테이블의 하위 집합에 필요한 데이터 구조 만 만들도록합니까?
면책 조항 : 저는 프로젝트 엔티티 프레임 워크 노력 의 소유자입니다
라이브러리에는 복원 지점을 생성하고 롤백 할 수있는 기능이 있습니다.
따라서이 트릭을 사용하면 모든 테이블이 작성 될 때마다 CreateRestorePoint()
한 번만 사용한 다음 모든 테스트에 대해 RollbackToRestorePoint
시작할 수 있습니다. (작동시키는 다른 방법이 몇 가지 있지만 요점을 알 것 같습니다)
매번 테이블을 생성 할 필요가 없기 때문에 테스트 실행 속도를 크게 높일 수 있습니다.
예를 들면 다음과 같습니다.
var conn = Effort.DbConnectionFactory.CreateTransient();
using (var context = new EntityContext(conn))
{
context.EntitySimples.Add(new EntitySimple { ColumnInt = 1 });
context.EntitySimples.Add(new EntitySimple { ColumnInt = 2 });
context.EntitySimples.Add(new EntitySimple { ColumnInt = 3 });
context.SaveChanges();
}
// Create a RestorePoint that will save all current entities in the "Database"
conn.CreateRestorePoint();
// Make any change
using (var context = new EntityContext(conn))
{
context.EntitySimples.RemoveRange(context.EntitySimples);
context.SaveChanges();
}
// Rollback to the restore point to make more tests
conn.RollbackToRestorePoint();
단위 테스트와 통합 테스트를 분리하십시오. 통합 테스트의 경우 데이터베이스를 사용하고 시간을 절약하기 위해 더 높은 환경에서 실행할 수 있지만 로컬 환경에서는 Faker \ Bogus 및 NBuilder를 사용하여 단위 테스트를위한 대규모 데이터를 생성 할 수 있습니다.
https://dzone.com/articles/using-faker-and-nbuilder-to-generate-massive-data
다른 옵션은 단위 테스트 사례에 해당하는 리소스 파일을 만들 수 있습니다 https://www.danylkoweb.com/Blog/the-fastest-way-to-mock-a-database-for-unit-testing-B6
또한 InMemoryDB vs SqlLite 성능, http://www.mukeshkumar.net/articles/efcore/unit-testing-with-inmemory-provider-and-sqlite-in-memory-database-in-도 살펴 보겠습니다 . ef-core
위의 예는 EFCore에 대한 것이지만 EF6에서는 SqlLite https://www.codeproject.com/Tips/1056400/Setting-up-SQLite-and-Entity-Framework-Code-First를 사용할 수도 있습니다.
따라서 통합 테스트 시나리오를 위해 sqllite를 사용하는 것이 좋습니다. 단위 테스트의 경우 sqllite 또는 Faker \ Bogus 및 NBuilder를 사용할 수 있습니다.
그것이 도움이되기를 바랍니다!