그것은 나쁜 연습을 실행하는 테스트를 데이터베이스에서는 대신에 저장소?

StackOverflow https://stackoverflow.com/questions/607620

문제

내가 무엇을 알고 이점은 사용 가짜 데이터를 때 나는 더 복잡한 시스템입니다.

할 경우 어떻게 무언가를 개발하는 간단하고 쉽게 설정할 수 있습 환경에서 실제 데이터베이스 및 데이터 액세스입니다 그래서 작은 것에 대한 액세스 시간은 없는 요인,그리고 나만을 실행할 수 있습니다.

그것은 여전히 중요한 것을 만들은 가짜 데이터 수 있습니까 잊을 추가 코딩과 오른쪽으로 이동하는 실제한 것은?

제가 말한 실제 데이터베이스 내가 의미하지 않는 생산 데이터베이스,나는 의미한 테스트 데이터베이스를 사용하여 실제 살아있는 DBMS 과 동일한 스키마로 실제 데이터베이스입니다.

도움이 되었습니까?

해결책

실제 DB 대신 가짜 데이터를 사용하는 이유는 다음과 같습니다.

  1. 속도. 테스트가 느리면 실행되지 않습니다. DB를 조롱하면 테스트가 다른 것보다 훨씬 빠르게 실행될 수 있습니다.
  2. 제어. 테스트는 테스트 데이터의 유일한 소스 여야합니다. 가짜 데이터를 사용하면 테스트에서 사용할 가짜를 선택합니다. 따라서 누군가가 익숙하지 않은 상태로 DB를 떠났기 때문에 시험이 망가질 가능성이 없습니다.
  3. 주문 독립성. 우리는 테스트가 어떤 순서로든 실행할 수 있기를 원합니다. 한 테스트의 입력은 다른 테스트의 출력에 의존해서는 안됩니다. 테스트가 테스트 데이터를 제어하면 테스트가 서로 독립적 일 수 있습니다.
  4. 환경 독립성. 모든 환경에서 테스트를 실행할 수 있어야합니다. 기차, 비행기, 집 또는 직장에서 운영 할 수 있어야합니다. 외부 서비스에 의존해서는 안됩니다. 가짜 데이터를 사용하면 외부 DB가 필요하지 않습니다.

이제 작은 애플리케이션을 구축하고 실제 DB (MySQL과 같은)를 사용하면 위 목표를 달성 할 수 있습니다. 그런 다음 DB를 사용할 수 있습니다. 그래요. 그러나 신청서가 커지면 결국 DB를 조롱해야 할 필요성에 직면하게됩니다. 괜찮아요, 필요할 때 해요. 야그니. 필요할 때 그렇게해야합니다. 당신이 그것을 놓아 주면, 당신은 지불 할 것입니다.

다른 팁

그것은 당신이 테스트하고 싶은 것에 달려 있습니다. 종종 데이터베이스의 데이터가 아닌 코드의 실제 논리를 테스트하려고하므로 테스트를 실행하기 위해 완전한 데이터베이스를 설정하는 것은 시간 낭비입니다.

또한 테스트를 유지하고 테스트 파베이스를 유지하는 작업의 양을 고려하십시오. 데이터베이스로 코드를 테스트하면 종종 다른 부품이 분리 된 대신 응용 프로그램 전체를 테스트하고 있음을 의미합니다. 이로 인해 종종 데이터베이스와 테스트를 동기화하는 많은 작업이 발생합니다.

마지막 문제는 테스트가 분리되어야한다는 것입니다. 따라서 각 테스트는 자체 버전의 데이터베이스에서 실행되거나 테스트가 실행되기 전과 동일한 상태로 남겨 두어야합니다. 여기에는 테스트 실패 후 상태가 포함됩니다.

데이터베이스에서 실제로 테스트하고 싶다면 가능합니다. 다음과 같이 데이터베이스를 설정하고 찢는 데 도움이되는 도구가 있습니다. DBUNIT.

나는 사람들이 이와 같은 유닛 테스트를 만들려고하는 것을 보았지만 거의 항상 그것은 훨씬 더 많은 일로 판명되면 실제로 가치가 있습니다. 프로젝트 중에 대부분의 사람들은 프로젝트 중에 TTD를 완전히 포기하면서 경험이 일반적으로 단위 테스트로 전달되는 것으로 생각했습니다.

따라서 테스트를 간단하고 격리하고 코드를 캡슐화하는 것이 좋습니다. 코드를 충분히 캡슐화하여 코드를 분리하여 테스트 할 수 있습니다.

쿼리가 리포지토리 내부 (더 나은 옵션, IMO) 내에서 고정되어 있는지 또는 저장소가 복합 가능한 쿼리를 노출하는지 여부에 달려 있다고 생각합니다. 예를 들어 - 저장소 방법이있는 경우 :

IQueryable<Customer> GetCustomers() {...}

그런 다음 UI가 요청할 수 있습니다.

var foo = GetCustomers().Where(x=>SomeUnmappedFunction(x));

bool SomeUnmappedFunction(Customer customer) {
   return customer.RegionId == 12345 && customer.Name.StartsWith("foo");
}

이것은 객체 기반 가짜 repo에 전달되지만 실패합니다. 실제 DB 구현. 물론 저장소가 내부적으로 모든 쿼리를 처리함으로써이를 무효화 할 수 있습니다 (외부 구성 없음). 예를 들어:

Customer[] GetCustomers(int? regionId, string nameStartsWith, ...) {...}

이것은 구성 할 수 없기 때문에 DB와 UI를 독립적으로 확인할 수 있습니다. 종합 가능한 쿼리를 사용하면 유용하기를 원한다면 통합 테스트를 사용해야합니다.

오히려 테스트에 의해 DB가 자동으로 설정되는지 여부, 데이터베이스가 다른 개발자로부터 격리되어 있는지 여부에 따라 다릅니다.

현재 그것은 문제가되지 않을 수 있습니다 (예 : 한 명의 개발자 만). 그러나 (수동 데이터베이스 설정의 경우) 데이터베이스를 설정하는 것은 테스트 실행에 추가적인 장애이며, 이는 매우 나쁜 것입니다.

당신이 절대적으로 아는 간단한 일회성 응용 프로그램을 쓰고 있다면, 나는 많은 "모범 사례"가 창 밖으로 나가는 것만으로 생각합니다.

당신은 그렇지 않습니다 필요 DI/IOC를 사용하거나 단위 테스트를하거나 DB 액세스를 조롱하려면 쓰고있는 모든 것이 간단한 "연락처"양식 인 경우 DB 액세스를 조롱하십시오. 그러나 "간단한"앱과 "복잡한"앱 사이의 선을 그릴 수있는 곳은 어렵습니다.

다시 말해, 이것에 대한 어려운 대답이 없으므로 최선의 판단을 사용하십시오.

"단위"테스트로 보지 않는 한 시나리오에서는 그렇게해도됩니다. 그것들은 통합 테스트입니다. 또한 연기 테스트를 자동화했을 수도 있기 때문에 UI를 통해 수동으로 다시 테스트 할 것인지 고려하고 싶습니다. 이를 감안할 때, 통합 테스트를 전혀하지 않는 것을 고려하고 기능/UI 테스트 수준에서 작업 할 수도 있습니다 (이미 통합을 다루기 때문에).

지적한 바와 같이, 복잡한/비 복잡한 일에 선을 그리는 것은 어렵고, 당신은 보통 너무 늦었을 때 :(. 당신이 이미 그들을하고 있다면, 나는 당신이 많은 것을 얻지 못할 것이라고 확신합니다. 오버 헤드. 그렇지 않은 경우, 당신은 그것으로부터 배울 수 있습니다 :)

실제 DB가 당신의 길을 가지지 않는 한, 당신은 그렇게 빨리 갈 수 있습니다. 나는 실용적이며 그것을 위해 갈 것입니다.

단위 테스트에서 "테스트"는 "단위"보다 중요합니다.

가정하려면 원하는 자동화,가장 중요한 것은할 수 있는 프로그램적으로 생성할 수 있는 초기 상태입니다.그것은 소리를 좋아하는 경우,그리고 더 나은 당신 테스트 실제 데이터입니다.

그러나 몇 가지 단점이 있:

귀하의 실제 데이터베이스지 않을 수도 있습 특정 조건에서 당신의 코드입니다.는 경우에 당신은 가짜는 데이터는,당신은 발생되는 행동이 일어난다.

고 당신은 지적으로,당신은 간단한 응용 프로그램게 될 때 적은 간단합니다,당신은 원하는 테스트할 수 있습으로 분류 단위 테스트 및 시스템을 테스트합니다.단위 테스트 대상으로 해야 하는 간단한 조각의 기능을 것이다,많은 일을 쉽게 가짜를 가진 데이터이다.

의 장점 중 하나는 가짜소는 귀하의 회귀/유닛 테스트는 일관된할 수 있기 때문에 동일한 기대에 대한 결과 동일한 쿼리를 처리합니다.이것은 쉽게 구축하는 특정 유닛 테스트합니다.

에는 몇 가지 불편한 점이 있습니다면 코드(있을 경우지 않은 질 만)데이터를 수정한다:-가 있으면 오류 코드에서는(아마도 당신 테스트),끝날 수 있었을 깨고 생산 데이터베이스입니다.는 경우에도 당신은 끊지 않습니다.-을 경우 생산 데이터베이스에 변경을 통해 시간과 특히 동안 당신의 코드를 실행하는,당신을 잃을 수 있습니다 추적 테스트 자료는 당신이 추가되고 힘든 시간을 나중에 그것을 청소의 데이터베이스입니다.-생산에서 쿼리를 다른 시스템에 액세스하는 데이터베이스로 처리할 수도 있습 테스트 데이터로 실제 데이터와 이할 수 있는 손상된 결과의 중요한 비즈니스 프로세스 어딘가에 있습니다.예를 들어,는 경우에도 당신은 당신의 데이터 특정 플래그나 접두사할 수 있는 사람이 있는 데이터베이스에 액세스하는 것입을 준수하는 이 스키마는?

또한,일부 데이터베이스에 의해 규제되는 개인정보 보호법,그래서 당신의 계약에 따라 고유의 주요 DB,하지 않을 수도 있습니다 법적으로 액세스할 수 있는 실제 데이터입니다.

을 실행해야 하는 경우에 생산 데이터베이스,나는 추천에서 실행 되는 복사본을 쉽게 만들 수 있습니다 동안의 피크 시간입니다.

정말 간단한 응용 프로그램이며, 성장하는 것을 볼 수 없습니다. 실제 DB에서 테스트를 실행하는 데 아무런 문제가 없습니다. 그러나이 응용 프로그램이 성장할 것이라고 생각하면 테스트에서이를 설명하는 것이 중요합니다.

모든 것을 최대한 단순하게 유지하고 나중에 더 유연한 테스트가 필요한 경우 그렇게하십시오. 그래도 3 년 안에 거대한 응용 프로그램을 원하지 않기 때문에 오래된 응용 프로그램 (대규모 응용 프로그램) 테스트에 의존하는 대규모 응용 프로그램을 원하지 않기 때문에 미리 계획하십시오.

데이터베이스에 대한 실행 테스트의 단점은 속도가 부족하고 테스트를 실행하기 전에 데이터베이스 상태를 설정하기위한 복잡성입니다.

이를 제어 할 경우 데이터베이스에 대해 직접 테스트를 실행하는 데 아무런 문제가 없습니다. 가짜 데이터에 대해 실행하는 것보다 최종 제품을 더 잘 시뮬레이션하기 때문에 실제로 좋은 접근법입니다. 핵심은 실용적인 접근 방식을 갖고 모범 사례를 규칙이 아닌 지침으로 보는 것입니다.

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