2009-05-12 9 views

답변

3

테스트중인 클래스를 분리하는 데 필요한만큼의 mock을 추가해야합니다. 테스트의 일부가 아니어야하는 모든 종속성에 대해 모의가 필요합니다.

간결성을 위해 두 개 또는 세 개의 클래스를 함께 테스트하는 경우가 있습니다. 구성 요소처럼 무언가를 만들고 고도로 결합되어 있기 때문입니다. 다른 모든 것은 조롱 받아야합니다.

나는이 "모범 사례"가 단지 하나의 모의 (mock)을 갖고 있고 또한 그것을 이해하지 못한다는 것을 안다. 단위 테스트에서 우리는 많은 모의 객체를 가지고 있으며, 일부 환경 모의 객체는 내가 작성한 테스트 프레임 워크 (예 : TransactionService, SecurityService, SessionService)에 의해 설정된다. 기슈 (Gishu)가 이미 그의 대답에서 언급했듯이, 많은 사람들은 높은 의존성을 나타냅니다. 너무 많은 것을 생각하면 그것은 당신에게 달려 있습니다. 우리는 많은 작은 인터페이스를 가지고 있습니다.

는 주위에 당신의 대답을 켜려면, 당신이해야 하지 모의 종속성 때

  • 그것은 등 내부 클래스, private 클래스
  • 같은 테스트중인 클래스의 높은 결합 부분입니다 Collection과 같은 일반적인 .NET 프레임 워크 클래스
  • 해당 클래스와의 상호 작용을 정확하게 테스트하기 위해 통합 테스트를 작성하려고합니다. (당신은 여전히 ​​다른 모든 것을 조롱하고 당신은 여전히 ​​고립 된 모든 관련 클래스에 대한 단위 테스트를 가지고 있습니다.)
  • 특정 클래스를 조롱하는 것은 단지 비쌉니다. 너무 비싸지 만 조심스럽게 설정하는 것은 어려울 것 같지만 실제 수업을 사용할 때의 유지 관리 문제와 비교하여 산들 바람에 빠지게됩니다. 그러나 인터페이스에 맞춰 구현되지 않는 일부 프레임 워크와 기술이 있으며 모의하기가 매우 어렵습니다. 이 프레임 워크 클래스를 자신의 인터페이스 뒤에 배치하기에는 너무 비싸면 테스트에 포함시켜야합니다.
3

당신이 어떤 기사를 말하는지는 잘 모르겠지만 일반적으로 테스트중인 클래스에 대한 의존성 당 하나의 모의 객체가 있습니다.

+0

"단위 테스트 기술"은 이렇게 말합니다. 한 가지 의미가 분명하지 않을 때마다 테스트 당 한 가지만 테스트하십시오. –

5

문맥에 따라 단위 테스트에서 하나 이상의 모의를 사용할 수 있습니다.

그러나 나는

  • 예방을 조롱 이상이-IS에서 '기사'가 암시 될 일을 생각합니다. 단위 테스트가 모든 공동 작업자를 조롱하면 문을 열어 두십시오. 실제 공동 작업자를 대체 할 때 시나리오가 실패 할 수 있습니다. 모의 수를 최소화하고 가능한 공동 작업자를 최대한 활용하여 위험을 최소화하십시오.
  • 하이 커플 링 경고 : 단위 테스트를 작성하기 위해 많은 공동 작업자를 모의해야하는 경우 높은 커플 링을 나타내는 디자인 냄새 일 수 있습니다.
+0

커플 링 힌트 +1.하지만 모의 수를 줄이기 위해 "실제 공동 작업자"를 사용하는 것은 권장하지 않습니다. 때로는 여러 클래스를 함께 테스트합니다. 그 이유는 클래스가 많이 결합되어 구성 요소를 작성하기 때문입니다. 그러나 외부의 모든 것은 가능한 한 잘 격리되어야합니다. 너무 많은 가짜를 찾으면 커플 링 문제가 생깁니다. 그렇다면 리팩터링을해야합니다. –

+0

mock의 수를 줄이기 위해가 아니라 실제 미러를 실제 미러로 만들기 위해 '실제'공동 작업자를 사용하는 것이 좋습니다. 이것은 모의 객체 세트로 게임을했기 때문에 테스트가 통과되는 것을 피하기 위해서입니다. 그러나 현실 세계에서는 종속성 중 하나가 해당 모의 행위처럼 행동하지 않기 때문에 작동하지 않습니다. 공동 작업자가 단위 테스트의 속도를 늦추지 않으면 경계에서 인터페이스를 만든 다음 모의 객체를 사용하는 것이 과잉입니다. – Gishu

+0

@ Gishu : 나는 동의하지 않는다. 모의는 속보를위한 것이지 격리를위한 것이 아닙니다. 테스트중인 코드를 가능한 한 잘 분리해야합니다. 이는 화학 분야의 실험실 테스트와 같으며, 단일 프로세스를 분리하기위한 환경을 단순화합니다. 그런 다음 알 수없는 환경과 무관하게 프로세스가 수행하는 작업을 증명할 수 있습니다. 모의는 사소하고 관리가 용이해야합니다. 다른 클래스는 알 수없는 또 다른 클래스입니다. 당신이하고있는 일도 중요하지만 통합 테스트이기 때문에 하나의 클래스가 명세에 따라 행동하고 있다는 것을 증명해야합니다. –

관련 문제