문제

테스트 기반 개발을 연습하는 초보자로서 데이터베이스에 대한 단위 테스트 지속성을 어떻게 해야 할지 난감한 상황에 빠지는 경우가 많습니다.

기술적으로 이는 통합 테스트(단위 테스트가 아님)라는 것을 알고 있지만 다음에 대한 최상의 전략을 찾고 싶습니다.

  1. 쿼리를 테스트합니다.
  2. 인서트 테스트.삽입물이 실패할 경우 잘못된 삽입물인지 어떻게 알 수 있나요?삽입한 후 쿼리하여 테스트할 수 있지만 쿼리가 잘못되지 않았는지 어떻게 알 수 있습니까?
  3. 업데이트 및 삭제 테스트 - 삽입 테스트와 동일

이를 수행하기 위한 모범 사례는 무엇입니까?


SQL 테스트 관련:이것이 수행될 수 있다는 것을 알고 있지만 NHibernate와 같은 O/R 매퍼를 사용하면 출력 쿼리에 사용되는 별칭에 일부 이름 지정 사마귀가 첨부되며 이는 다소 예측할 수 없기 때문에 테스트할 수 있을지 잘 모르겠습니다. 저것.

그냥 모든 것을 버리고 NHibernate를 신뢰해야 할까요?그게 신중한 것인지 잘 모르겠습니다.

도움이 되었습니까?

해결책

DB 유닛을 살펴보세요.이는 Java 라이브러리이지만 이에 상응하는 C# 라이브러리가 있어야 합니다.이를 통해 데이터베이스에 무엇이 있는지 알 수 있도록 일련의 데이터로 데이터베이스를 준비한 다음 DB 장치와 인터페이스하여 데이터베이스에 무엇이 있는지 확인할 수 있습니다.이는 많은 데이터베이스 시스템에 대해 실행될 수 있으므로 실제 데이터베이스 설정을 사용하거나 Java의 HSQL(메모리 옵션이 있는 Java 데이터베이스 구현)과 같은 다른 것을 사용할 수 있습니다.

코드가 데이터베이스를 제대로 사용하고 있는지(대부분 수행해야 함) 테스트하려는 경우 이는 각 테스트를 격리하고 데이터베이스가 예상한 데이터가 준비되었는지 확인하는 방법입니다.

다른 팁

처럼 마이크 스톤이 말했다., DbUnit은 테스트를 실행하기 전에 데이터베이스를 알려진 상태로 만드는 데 적합합니다.테스트가 완료되면 DbUnit은 데이터베이스를 테스트를 실행하기 전의 상태로 되돌릴 수 있습니다.

DbUnit(자바)

DbUnit.NET

데이터베이스 연결을 모의하여 단위 테스트를 수행합니다.이런 방식으로 메서드 호출 흐름의 특정 쿼리가 성공하거나 실패하는 시나리오를 구축할 수 있습니다.나는 일반적으로 실제 쿼리 텍스트가 무시되도록 모의 기대치를 구축합니다. 왜냐하면 메서드의 내결함성과 메서드 자체를 처리하는 방법을 테스트하고 싶기 때문입니다. SQL의 세부 사항은 그 목적과 관련이 없습니다.

분명히 이는 테스트에서 메서드가 실제로 확인되지 않는다는 것을 의미합니다. 공장, SQL이 잘못되었을 수 있기 때문입니다.통합 테스트가 시작되는 곳입니다.이에 대해서는 나 자신이 이제 막 이해하기 시작했기 때문에 다른 사람이 더 철저한 대답을 할 것이라고 기대합니다.

나는 여기에 관한 게시물을 썼습니다. 데이터 레이어 단위 테스트 이 정확한 문제를 다루고 있습니다.(부끄러운) 플러그에 대해 사과드립니다. 기사가 너무 길어 여기에 게시할 수 없습니다.

이것이 도움이 되기를 바랍니다. 지난 6개월 동안 3개의 활성 프로젝트에서 매우 잘 작동했습니다.

문안 인사,

롭 G

특히 ORM 없이 지속성을 단위 테스트할 때 경험한 문제는 쿼리가 성공할지 실제로 알 수 없다는 것입니다.귀하의 쿼리는 특정 데이터베이스 버전용으로 특별히 설계되었으며 해당 버전에서만 성공할 수 있습니다.데이터베이스를 조롱하면 결코 알 수 없습니다.따라서 제 생각에는 단위 테스트 지속성은 제한적으로만 사용됩니다.항상 대상 데이터베이스에 대해 실행되는 테스트를 추가해야 합니다.

을 위한 NHibernate, 나는 확실히 다음을 조롱하는 것을 옹호합니다. NHibernate API 단위 테스트의 경우 - 라이브러리가 올바른 작업을 수행하도록 신뢰하십시오.실제로 데이터가 DB로 가는지 확인하고 싶다면 통합 테스트를 해보세요.

JDBC 기반 프로젝트의 경우 내 Acolyte 프레임워크를 사용할 수 있습니다. http://acolyte.eu.org .특정 테스트 DB를 관리할 필요 없이 JDBC 추상화의 이점을 활용하여 테스트하려는 데이터 액세스를 모형화할 수 있습니다.

또한 데이터베이스를 조롱하고 쿼리가 예상한 것과 같은지 확인합니다.테스트에서 잘못된 SQL을 검사할 위험이 있지만 이는 통합 테스트에서 감지됩니다.

기술적으로 지속성에 대한 단위 테스트는 단위 테스트가 아니라 통합 테스트입니다.

mbUnit을 사용하는 C#에서는 SqlRestoreInfo 및 RollBack 특성을 사용하기만 하면 됩니다.

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

NUnit에서도 동일한 작업을 수행할 수 있지만 속성 이름이 약간 다릅니다.

쿼리가 성공했는지 확인하려면 일반적으로 데이터베이스가 예상대로 변경되었는지 확인하기 위해 두 번째 쿼리를 수행해야 합니다.

나는 일반적으로 저장소를 만들고 이를 사용하여 내 엔터티를 저장한 다음 새로운 항목을 검색합니다.그런 다음 검색된 항목이 저장된 항목과 동일하다고 주장합니다.

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