EFCore의 InMemoryDatabase를 자동화된 테스트 도구로 사용

안녕하세요 #닷넷친구들!

데이터 액세스 계층이 있고, API가 모든 CRUD 작업을 처리하고, 단위 테스트에서 모의 ​​객체를 사용하여 각 개체 간의 상호 작용을 시뮬레이션합니다. 스스로에게 물어보는 순간입니다. 내가 정말 무언가를 테스트하고 있습니까? 모든 개체는 종속성의 단순화된 모의 버전과 상호 작용하므로 데이터 조작 클래스의 매우 기본적인 기능만 확인합니다.

통합 테스트를 구현하면 해결될 것입니다. 맞습니까? 문제는 조작을 위해 데이터베이스를 만지는 것이 항상 가능한 것은 아니라는 것입니다. 대량 삭제 작업이 있거나 프로덕션에서 실행해야 하는 경우 모든 종류의 문제를 일으킬 수 있는 작업이 있는 경우 어떻게 합니까? 귀하의 테스트 엔진은 프로덕션 데이터베이스에 액세스할 수 없을 것입니다. 이 시나리오의 경우 DB를 가상화하는 전체 통합 테스트의 안전하고 유연하며 실제 데이터에 가까운 접근 방식으로 자동화의 편리함 사이의 중간 지점을 찾는 도구가 있습니다. 이미 EntityFramework Core를 사용하고 있다면 전체 프로세스가 매우 간단할 수 있습니다!

다음과 같은 데이터베이스 컨텍스트가 있다고 가정해 보겠습니다.

public partial class SampleContext : DbContext
{
  public SampleContext(DbContextOptions<SampleContext> options)
  : base(options) {  }

  public virtual DbSet<Product> Product { get; set; }
}


그런 다음 해당 데이터베이스 컨텍스트를 서비스 DI 공급자에 주입할 수 있습니다. 다음과 같이 표시됩니다.

services.AddDbContext<SampleContext>(options =>options.UseSqlServer(
    configuration.GetConnectionString("MyConnectionString")));


이것은 모두 EFCore 및 .NETCore 웹 API에 대한 매우 일반적인 코드입니다. 비슷한 것이 있다면 운이 좋은 것입니다! 나는 일반적으로 xUnit을 선호하지만 NUnit 또는 다른 테스트 프레임워크를 사용하는 경우 거의 동일하게 보일 것입니다. 시작 단계 또는 생성자에서 DatabaseContext 개체를 가상화된 방식으로 간단하게 인스턴스화할 수 있습니다.

public class SampleTests
{
    private readonly SampleContext _virtualContext;    
    public SampleTests()
    {  
        _virtualContext = new SampleContext(
            new DbContextOptionsBuilder<SampleContext>()
               .UseInMemoryDatabase(databaseName: "SampleDb")
               .Options
            );
    }
}


그리고 그것은 거의 다입니다! 이제 테스트와 관련된 데이터를 추가하고 테스트 메서드를 시작하고, 삭제하고, 자르고, 실행이 완료되면 모든 것이 사라질 데이터베이스를 폭발시킬 수 있습니다. 다음은 위의 예에 대한 기본 데이터 이니셜라이저 함수입니다(동일한 _virtualcontext 및 제품 레코드 사용:

List<Product> products = new()
{
    new Product()
    {
        ProductName = "TestProduct"
    },
    new Product()
    {
        ProductName = "AnotherTestProduct"
    }
};
products.ForEach(p => _virtualContext.Products.Add(p));
_virtualContext.SaveChanges();


이제 데이터 조작과 함께 컨트롤러/엔드포인트를 호출하고 출력의 유효성을 검사하는 테스트를 작성할 수 있습니다. 테스트 관리자가 API를 시작하면 가상화된 DB를 인스턴스화하고 기본 코드는 이에 종속되지 않습니다. 자신의 코드를 속이는 것만큼 좋은 것은 없겠죠?

도움이 되셨다면 알려주시고 팔로우 해주세요. 읽어주셔서 감사합니다!

좋은 웹페이지 즐겨찾기