이 개념부터
시작하십시오 . 1) 원하는 행동으로 시작하십시오. 테스트를 작성하십시오. 테스트 실패를 참조하십시오.
2) 시험에 합격하기에 충분한 코드를 작성하십시오. 모든 테스트 통과를 참조하십시오.
3) 중복 / 조잡한 코드-> 리 팩터를 찾으십시오. 테스트가 여전히 통과 참조하십시오. 고토 1
따라서 # 1에서 새로운 명령을 만들고 싶다고 가정 해 봅시다 (명령이 작동하는 방식으로 확장 중이므로 나에게 견딜 것입니다). (또한 극단적 인 TDD보다는 약간 실용적입니다)
새 명령의 이름은 MakeMyLunch이므로 먼저 인스턴스화 할 테스트를 작성하고 명령 이름을 가져옵니다.
@Test
public void instantiateMakeMyLunch() {
ICommand command = new MakeMyLunchCommand();
assertEquals("makeMyLunch",command.getCommandName());
}
새 명령 클래스를 작성하고 이름을 리턴하도록 강제하지는 않습니다 (순수자는 이것이 1이 아닌 2 라운드의 TDD라고 말합니다). 따라서 클래스를 작성하고 명령 이름 리턴을 포함하여 ICommand 인터페이스를 구현하도록하십시오. 모든 테스트를 실행하면 이제 모든 패스가 표시되므로 리팩토링 기회를 찾으십시오. 아마 없습니다.
다음으로 실행을 구현하고 싶습니다. "MakeMyLunch"가 성공적으로 "내 점심을 만들었다"는 것을 어떻게 알 수 있습니까? 이 작업으로 인해 시스템에 어떤 변화가 있습니까? 이것을 테스트 할 수 있습니까?
테스트하기가 쉽다고 가정하십시오.
@Test
public void checkThatMakeMyLunchIsSuccessful() {
ICommand command = new MakeMyLunchCommand();
command.execute();
assertTrue( Lunch.isReady() );
}
다른 경우에는 이것이 더 어렵고, 실제로하고 싶은 것은 테스트 대상 (MakeMyLunchCommand)의 책임을 테스트하는 것입니다. 아마도 MakeMyLunchCommand의 책임은 Fridge 및 Microwave와 상호 작용하는 것입니다. 그래서 그것을 테스트하기 위해 mock Fridge와 mock Microwave를 사용할 수 있습니다. [두 샘플 모의 프레임 워크는 Mockito 와 nMock 이거나 여기를보십시오 .]
이 경우 다음 의사 코드와 같은 작업을 수행합니다.
@Test
public void checkThatMakeMyLunchIsSuccessful() {
Fridge mockFridge = mock(Fridge);
Microwave mockMicrowave = mock(Microwave);
ICommand command = new MakeMyLunchCommand( mockFridge, mockMicrowave );
command.execute();
mockFramework.assertCalled( mockFridge.removeFood );
mockFramework.assertCalled( microwave.turnon );
}
순수 주의자는 수업의 책임을 테스트합니다-다른 수업과의 상호 작용 (명령이 냉장고를 열고 전자 레인지를 켰습니까?)
실용 주의자는 수업 그룹을 테스트하고 결과를 테스트한다고 말합니다 (점심 준비가 되셨습니까?).
귀하의 시스템에 적합한 저울을 찾으십시오.
(참고 : 인터페이스 구조가 너무 일찍 도착했다는 것을 고려하십시오. 단위 테스트 및 구현을 작성하면서 3 단계에서 공통 인터페이스 기회를 "통지"할 수 있습니다.