3

서비스 계층에서 저장소 패턴을 사용하는 보통 복잡도의 asp.net mvc 응용 프로그램을 상상해보십시오. 이제 우리가 광범위한 의존성을 가지고 어떤 행동을한다고 상상해보십시오. 인위적인 예를 들자면 다음 CustomerController는 다음 기준에 모두 부합하는 고객을 표시하는 데 필요한 :복잡한 개체 그래프를 테스트하는 단위

  • 고객의 결제 또는 배송 주소는 플로리다에
  • 고객은
  • 고객 (ClubMembershipService 사용) VIP 클럽에 이 적어도 하나의 이전 주문
  • 고객은 모델 년에 적어도 하나 개의 자동차를 소유하고 2,005 이상
  • 자동차는 몇 가지로, 등등
  • 및 리콜 됐어요 부분이있다 더 1 대 1 또는 제 3 자 API 호출

이 범위의 각 테스트에는 엄청난 양의 시드/모의 데이터가 필요합니다. 다음 테스트에서는 비슷하지만 상당히 다른 데이터 집합이 필요할 것입니다. 컨트롤러 레벨에서의 테스트에서 6 개의 서비스를 주입해야하고, 8 개의 저장소를 해당 서비스에 주입해야한다고 가정 해 봅시다.

테스트를 어떻게 관리 할 수 ​​있습니까? 딥 객체 그래프를 탐색하고 모의 (또는 콘크리트) 리포지토리가 각 테스트에서 30 줄의 설치 코드없이 유효하고 일관된 데이터를 제공하도록하려면 어떻게해야합니까?

이 테스트 데이터베이스를 사용하여 순수 통합 테스트한다면, 나는 다음해야 할 수 있습니다

  • 몇 고객 기록
  • 몇 주소 기록을; 다수 주소 기록을 가진 몇몇 고객; 누구의 선적 주소가 플로리다에 있는지; 청구서 수신 주소가 플로리다에있는 사람
  • 약간의 주문
  • 일부 "CustomerCar"레코드; 자동차 중 하나에 2005 년 또는 그 이후 모델이 있어야합니다.
  • 일부 "CarPartRecall"레코드; 이들 중 일부는, 로직 나는 그것이 속성으로 고객 개체에 이러한 기준을 부착 적합 할 수 있습니다 이해

/를 CustomerCar 기록 추가 기준에 대한 등등

  • 와의 제조업체, 모델 및 연도를 일치합니다 customer.IsInVipClub 에서처럼. 복잡한 집계가 여러 개인 경계를 넘기 때문에 단순한 속성으로 변환하지 않는 복잡한 사례에 더 관심이 있습니다. 예 : customer.Owns2005OrNewerCarWithRecalledParts는 일반적으로 쓰지 않는 속성입니다.

    자동 수정이 제안되었습니다. 조롱 프레임 워크와 조명기 팩토리 사이의 십자가처럼 보입니다 (factoryGirl에서 레일을위한 것처럼). 나는 그것이 customer.firstName과 같은 몇몇 속성 값을 자동으로 공급함으로써 초기화 코드를 더 간결하게 만들 것이라고 생각하지만 상대적으로 작은 이득을 느낀다. AutoFixture를 사용하여 다른 사람의 경험을 듣고 싶습니다.

  • +0

    이 질문은 구체적인 예를 통해 도움이 될 수 있습니다. 나에게 이것은 설계 문제가 아닌 단위 테스트 문제로 들린다. 동일한 방법으로 6 개의 서비스와 8 개의 저장소와 상호 작용해야하는 경우이 방법이 가장 많이 수행됩니다. –

    +0

    나는 구체적인 예를 제공한다고 생각했다. 이 예에서 많은 다른 집계 루트에서 데이터가 필요합니다. 예 : CustomerService, AddressService ClubMembershipService, OrderService, CarService 등일 수 있습니다. 예를 들어 컨트롤러에서 내 글 머리 기호 목록의 모든 조건과 일치하는 고객 만 표시해야합니다. – betitall

    +0

    나는 내가 불분명하다고 생각한다. 나는 코드 예제를 의미했다. –

    답변

    1

    문제가 검색어와 비슷하지만 테스트시 아무런 가치가 없습니다. 모든 것이 통합적으로 테스트되어야합니다.

    정말로 테스트하고 싶다면 통합 테스트를 할 수 있습니다. 테스트 데이터베이스를 메모리에 설치하고, 더미 데이터를 삽입하고, 쿼리를 실행하여 결과를 표명하고 더미 데이터를 삭제하십시오.모든 테스트마다 반복하십시오.

    타사 API 호출의 경우 조롱 외에 다른 방법은 없습니다.

    아직 많은 작업이 있지만 일부 테스트는 수행하기가 더 어려우며 작성하는 데 더 많은 작업이 필요합니다.

    단위 테스트가 빠르게 실행되어야 함을 기억하십시오. 그들이 달리는 데 더 오랜 시간이 걸리면 덜 자주 달릴 것입니다. 반면에 통합 테스트는 수시로 실행될 수 있으며 더 많은 시간이 소요될 수 있습니다.

    +0

    이것이 "간단한"쿼리라는 것을 이해하지 못합니다. 나는이 코드가 실패 할 수있는 많은 다른 방법들을 상상할 수있다. 테스트하지 않으면 어떻게 작동하는지 알 수 있습니까? – betitall

    +0

    _simple_을 쉽지 않거나 중요하지 않게 만드십시오.하지만 결국에는 쿼리 일 뿐이며, 순수한 데이터 검색 방법을 테스트하는 장치에는 가치가 없습니다. 이것이 비즈니스의 핵심이라면 꼭 테스트 해보고 중요한 부분 인 데이터 검색을 테스트하십시오. 테스트 데이터베이스를 설정하고 데이터로 채우고 쿼리를 실행합니다. –

    +0

    "단순한"의미는 이해하지만,이 정의에 따르면 내 응용 프로그램 논리의 95 %가 "단순한 쿼리"라고 느낍니다. 통합 테스트가 내가 작업하는 데이터 중심의 LOB 앱에 비해 더 좋다고 생각하기 시작했습니다. 그들은 여전히 ​​많은 설정이 필요합니다. – betitall