그래서 TDD에 더 많이 들어가기 위해 새해 결심을 계속하면서 이제 Rhino Mocks 와 더 많이 작업하기 시작했습니다 .
내가하고 싶은 한 가지는 내가 무엇을하고 있는지 정말로 이해하고 있는지 확인하는 것이므로 지금까지 본 것에 대한 이해를 확인하고 싶었습니다 (그리고 여기에있는 것이 좋을 것이라고 생각했습니다. 자원).
그래서 TDD에 더 많이 들어가기 위해 새해 결심을 계속하면서 이제 Rhino Mocks 와 더 많이 작업하기 시작했습니다 .
내가하고 싶은 한 가지는 내가 무엇을하고 있는지 정말로 이해하고 있는지 확인하는 것이므로 지금까지 본 것에 대한 이해를 확인하고 싶었습니다 (그리고 여기에있는 것이 좋을 것이라고 생각했습니다. 자원).
답변:
Martin Fowler는 이 주제에 대한 훌륭한 기사 를 썼습니다 . 그 기사에서 :
Meszaros는 테스트 목적으로 실제 개체 대신 사용되는 모든 종류의 가상 개체에 대한 일반적인 용어로 Test Double이라는 용어를 사용합니다. 이름은 영화에서 스턴트 더블이라는 개념에서 비롯되었습니다. (그의 목표 중 하나는 이미 널리 사용 된 이름을 사용하지 않는 것이 었습니다.) 그런 다음 Meszaros는 네 가지 특정 유형의 이중 유형을 정의했습니다.
- 더미 오브젝트는 전달되지만 실제로 사용되지는 않습니다. 일반적으로 매개 변수 목록을 채우는 데 사용됩니다.
- 가짜 객체는 실제로 작동하는 구현을 가지고 있지만 일반적으로 프로덕션에 적합하지 않게 만드는 지름길을 사용합니다 (인 메모리 데이터베이스가 좋은 예입니다).
- 스텁은 테스트 중에 이루어진 호출에 대해 미리 준비된 답변을 제공하며, 일반적으로 테스트를 위해 프로그래밍 된 내용 이외의 항목에는 전혀 응답하지 않습니다. 스텁은 또한 '보낸'메시지를 기억하는 이메일 게이트웨이 스텁 또는 '보낸 메시지 수'와 같은 통화에 대한 정보를 기록 할 수 있습니다.
- 모의는 우리가 여기서 이야기하고있는 것입니다 : 그들이받을 것으로 예상되는 호출의 사양을 형성하는 기대치로 미리 프로그래밍 된 객체.
내 말로 표현하자면 : 모의 객체는 특정 메서드가 호출 될 것으로 "예상"하며, 일반적으로 기대치가 충족되지 않으면 단위 테스트가 실패합니다. Stub 객체는 미리 준비된 응답을 제공하지만 (도우미 라이브러리에 의해 자동 생성 될 수 있음) 일반적으로 단위 테스트가 실패하도록 직접 유발 하지는 않습니다 . 일반적으로 테스트중인 개체가 작업을 수행하는 데 필요한 데이터를 가져 오기 위해 사용됩니다.
"스텁"은 데이터 / 일종의 응답을 제공하기 위해 존재하는 인터페이스의 구현입니다. 예를 들면 :
일반적으로 이것은 다른 서비스 (웹 서비스, 다른 응용 프로그램, 데이터베이스 등)에서 제공되지만 코드 의 테스트 가능성 을 향상시키기 위해 결과는 "가짜"입니다.
이것의 주요 이점은 예상되는 데이터를 기반으로 단위 테스트에서 어설 션을 만들 수 있다는 것입니다. 데이터 오류로 인해 오류가 발생하면 테스트를 쉽게 추가하고 새 스텁 (데이터 오류 복제)을 만들고 코드를 생성하여 오류를 수정할 수 있습니다.
스텁 은 객체 의 상태 를 표현하고 테스트하는 데 사용되는 반면 Mock은 상호 작용을 테스트 한다는 점에서 Mocks 와 다릅니다 .
나는 "스텁"이 STartUpBlock에서 나온다고 믿습니다. 개발자가 시작하는 데 도움이되도록 자동 생성되는 코드 부분을 참조하는 데 사용됩니다.
"스텁"또는 "스텁 메서드"는 시작 코드 또는 아직 개발되지 않은 코드를 임시로 대체하도록 설계되었습니다. IDE에서 생성 한 내장 코드입니다. 스텁 메서드는 실제로 특정 클래스의 메서드를 테스트하는 데 사용되는 메서드입니다. 실제 개발 방법에서 로컬 변수에 대한 일부 값을 입력하고 출력이 올바른지 확인하여 사용합니다. 코드에서 버그를 찾는 것이 중요합니다.
나는 최근에 질문에 직면했고 Stub 과 Driver의 비교 가 정말 명확하고 도움 이된다는 것을 깨달았습니다 .
기본적으로 스텁과 드라이버는 자신을 선언하고 허용하는 매개 변수를 제외하고는 실제로 아무것도하지 않는 루틴입니다. 그런 다음 나머지 코드는 이러한 매개 변수를 입력으로 사용할 수 있습니다.
+ --------- + ------------------------------- + ------- ------------------------ + | | 스텁 | 드라이버 | + --------- + ------------------------------- + ------- ------------------------ + | 유형 | 더미 코드 | 더미 코드 | + --------- + ------------------------------- + ------- ------------------------ + | 사용 | 하향식 통합 | 상향식 통합 | + --------- + ------------------------------- + ------- ------------------------ + | 목적 | 상단의 테스트를 허용하려면 | 낮은 테스트를 허용하려면 | | | 코드 수준, 때 | 코드 수준, 때 | | | 낮은 수준의 코드는 | 코드의 상위 수준은 | | | 아직 개발되지 않았습니다. | 아직 개발되지 않았습니다. | + --------- + ------------------------------- + ------- ------------------------ + | 예 | A와 B는 구성 요소입니다. | A와 B는 구성 요소입니다. | | | A ---> B | A ---> B | | | | | | | A가 개발되었습니다. | 아직 개발이 필요합니다. | | | B는 아직 개발이 필요합니다. | B가 개발되었습니다. | | | 따라서 스텁이 사용됩니다. | 따라서 드라이버가 사용됩니다. | | | 그것을 모방하기 위해 B 대신. | 대신 A 대신 모방 | | | | | | | A ---> 스텁 | 드라이버 ---> B | + --------- + ------------------------------- + ------- ------------------------ +