모의 객체는 언제 사용해야합니까?


14

TDD에 대해 많은 것을 읽었지만 여전히 의심의 여지가 있습니다. 예를 들어 다음과 같은 클래스 다이어그램이 있습니다.

여기에 이미지 설명을 입력하십시오

TDD 및 모의 객체에 대해 배우는 간단한 예입니다.

어떤 시험을 먼저 작성해야합니까? 제품 , 라인 및 마지막 주문 ? 그렇게하면 라인제품 을 사용 하여 주문 을 테스트 해야합니까, 아니면 모의 객체를 사용해야합니까? 모의 객체는 언제 사용해야합니까? XP 및 TDD와 함께 UML을 사용해야합니까?

나는 아직 이런 것들을 얻지 못했다.

답변:


10

다이어그램에서 판단하면 Product는 테스트 할 기능이없는 바보 같은 데이터 클래스입니다. 그래서 나는 첫 번째 라인에 대한 테스트를 작성하고 (TDD 스타일을 구현) 종속성 래더를 작성하기 시작합니다. 일반적으로 더 높은 수준의 수업을 시작하기 전에 더 낮은 수준의 수업을 테스트하는 것이 합리적입니다 (즉, 더 낮은 수준에 따라 다름). 이렇게하면 버그를보다 효율적으로 잡을 수 있습니다.

모의 객체를 사용해야하는지 여부는 테스트 된 클래스의 실제 종속성에 따라 다릅니다. 이것들이 테스트에 필요한 원하는 데이터 / 상태로 쉽게 인스턴스화하고 설정할 수있는 간단한 클래스라면 모의가 필요하지 않습니다. (여기서는 예제 디자인의 경우처럼 보입니다.) 그러나 종속성 중 하나가 초기화하기 어렵거나 광범위한 종속성이 있거나 바람직하지 않은 부작용이 있거나 DB와 같은 외부 리소스에 의존하는 경우 의미가 있습니다. 대신 모의 객체를 사용하십시오.


내가 전에 말했듯이, 그것은 단지 TDD와 Mock 객체들에 대해 배우는 간단한 시나리오였습니다 ... 큰 대답입니다. 감사합니다. UML은 어떻습니까? 피해야합니까?

@ Thomas, UML을 피할 필요가 없으며 TDD와 충돌하지 않습니다. UML은 설계 문제를 시각화 / 통신하는 데 매우 유용합니다. 이는 특정 개발 단계에서 매우 유용 할 수 있습니다. 그러나 디자인이 발전하고 코드와 동기화 된 아름답고 상세한 UML 시스템 다이어그램을 유지하려는 노력은 빠르게 부담이 될 수 있습니다. 더 이상 필요하지 않을 때는 버려야합니다 :-)
Péter Török

1
@ 토마스, 여기의 관습은 대답 옆에있는 위쪽 화살표를 클릭하여 유용한 답을 찬성하는 것입니다 :-)
Péter Török

4

여기 모의 객체가 많이 필요하지 않습니다. 다른 사람들이 지적했듯이 종속성을 설정하기 어려운 경우 주로 필요합니다.

예를 들어 컨트롤러를 테스트 할 때 Ruby on Rails 프로젝트와 함께 사용했으며 다른 컨트롤러를 호출하고 해당 정보의 일부를 쿠키에 저장해야하는 사용자 로그인이 필요했습니다. 이 경우 특정 액세스 권한에 대한 질문이있을 때 true를 반환하는 로그인 한 사용자를 조롱하면 도움이됩니다.


2

일반적으로 테스트를 위해 테스트중인 시스템 / 객체를 분리하려고하므로 외부에있는 것은 모의해야합니다. 따라서 클래스 다이어그램을 사용하여 주문 객체를 테스트 할 때 선 객체에 모의 객체를 사용하십시오. 라인을 테스트 할 때는 주문 및 제품에 모형을 사용하십시오. 제품을 테스트 할 때는 Line에 mock을 사용하십시오.


제품은 라인에 의존하지 않으므로 라인에 모의를 사용할 필요도 없습니다. 라인과 오더도 동일합니다.
Péter Török 2012 년

2

"TDD는 주로 소스 코드의 철저한 단위 테스트를 보장하는 부작용이있는 설계 기술입니다" -Scott W. Ambler

아이디어는 단위 테스트를 작성하여 디자인을 찾는 것입니다. 귀하의 경우에는 이미 디자인이 준비되어있는 것 같습니다. 이는 TDD의 목적을 다소 상실합니다 (디자인이 최종 가정이라고 가정).

조롱에 관해서. 모의하고 싶은 경우 주문 테스트시 라인 및 모의 라인에 대한 테스트를 작성할 때 제품을 모의하는 것이 좋습니다. 그러나 여기서 과잉 일 수 있습니다. 개인적으로 가능한 한 조롱을 제한하고 외부 클래스 (예 : 데이터베이스 인스턴스)에 대한 종속성을 분리하는 데 사용합니다.


2
난 그냥 간단한 클래스 다이어그램이 있습니다 ...

-1 설계 (클래스 다이어그램 스크라이브 포함)를 생각하면 TDD를 수행 할 수 없습니까? 그냥 잘못 들리 네요
Bjarke Freund-Hansen

1
@bjarkef : 답을 다시 읽으십시오. 디자인이 최종적인 경우 실제로 TDD를 사용하여 디자인을 이끌어 낼 수는 없습니다. 이것이 바로 TDD와 관련된 것입니다. 그리고 이것이 OP를 혼란스럽게 만드는 이유라고 생각합니다. 그는 이미 솔루션을 가지고 있으며 이제 테스트를 작성하려고합니다. "어떤 테스트를 먼저 작성해야합니까, 제품 또는 주문". 테스트를 먼저 작성하면 그 질문은 실제로 관련이 없습니다.
Martin Wickman

테스트 나 생산 코드없이 디자인이 최종적인지 어떻게 알 수 있습니까? 작동하는 무언가를 만들고 싶다고 가정하십시오.
JeffO

@Jeff : 분명히 할 수 없습니다. 그것은 TDD가 당신을 도울 수있는 것입니다.
Martin Wickman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.