다른 답변과 달리 테스트가 화이트 박스 인 경우 테스트 대상 시스템 (SUT)을 리팩터링 할 때 일부 테스트 방법 이 취약해질 수 있습니다 .
모의에 호출 된 메소드 의 순서 를 확인하는 모의 프레임 워크를 사용하는 경우 (통화에 부작용이 없으므로 순서가 관련이없는 경우); 그런 다음 코드가 다른 순서로 메소드 호출로 깨끗하고 리팩터링되면 테스트가 중단됩니다. 일반적으로 모의는 테스트에 취약성을 유발할 수 있습니다.
개인 또는 보호 된 구성원을 노출시켜 SUT의 내부 상태를 확인하는 경우 (Visual Basic에서 "friend"를 사용하거나 액세스 수준을 "internal"로 에스컬레이션하고 c #에서 "internalsvisibleto"를 사용할 수 있음) c # " test-specific-subclass "를 사용할 수 있습니다.) 갑자기 클래스의 내부 상태가 중요합니다. 클래스를 블랙 박스로 리팩토링 할 수 있지만 화이트 박스 테스트는 실패합니다. SUT 상태가 변경 될 때 단일 필드가 다른 것을 의미하기 위해 재사용된다고 가정합니다 (좋은 방법은 아닙니다!). 두 필드로 나누면 깨진 테스트를 다시 작성해야 할 수도 있습니다.
테스트 특정 서브 클래스를 사용하여 보호 된 메소드를 테스트 할 수도 있습니다. 이는 프로덕션 코드 관점에서 리 팩터가 테스트 코드 관점에서 근본적인 변화임을 의미 할 수 있습니다. 보호 된 방법으로 또는 밖으로 몇 줄을 이동하면 생산 부작용이 없지만 테스트를 중단 할 수 있습니다.
" 테스트 후크 "또는 다른 테스트 별 또는 조건부 컴파일 코드를 사용하는 경우 내부 논리에 대한 취약한 종속성으로 인해 테스트가 중단되지 않도록하기가 어려울 수 있습니다.
따라서 테스트가 SUT의 친밀한 내부 세부 사항에 결합되는 것을 방지하려면 다음을 수행하는 데 도움이 될 수 있습니다.
- 가능한 경우 모의보다는 스터브를 사용하십시오. 더 많은 정보를 참조 동어 반복적 시험에 파비오 Periera의 블로그 및 동어 반복적 테스트에 내 블로그를 .
- 모의를 사용하는 경우 중요하지 않은 한 호출되는 메소드의 순서를 확인하지 마십시오.
- SUT의 내부 상태 확인을 피하십시오. 가능하면 외부 API를 사용하십시오.
- 프로덕션 코드에서 테스트 별 논리를 피하십시오
- 테스트 특정 서브 클래스를 사용하지 마십시오.
위의 모든 사항은 테스트에 사용 된 화이트 박스 커플 링의 예입니다. 리팩토링 차단 테스트를 완전히 피하려면 SUT의 블랙 박스 테스트를 사용하십시오.
면책 조항 : 여기서 리팩토링을 논의하기 위해 외부 영향없이 내부 구현을 변경하는 것을 포함하기 위해 단어를 조금 더 광범위하게 사용하고 있습니다. 일부 순수 주의자들은 원자 적 리팩토링 작업을 설명하는 Martin Fowler와 Kent Beck의 책 리팩토링에 동의하지 않을 수도 있습니다.
실제로, 우리는 여기에 설명 된 원 자성 연산보다 약간 큰 비 차단 단계를 취하는 경향이 있으며, 특히 생산 코드가 외부에서 동일하게 작동하도록하는 변경은 테스트를 통과하지 못할 수 있습니다. 그러나 리 팩터로 "동일한 동작을 가진 다른 알고리즘의 대체 알고리즘"을 포함시키는 것이 공정하다고 생각하며 Fowler도 동의합니다. Martin Fowler 자신은 리팩토링이 테스트를 중단 할 수 있다고 말합니다.
모의 테스트를 작성할 때 SUT가 아웃 바운드 통화를 테스트하여 공급 업체와 제대로 통신하는지 확인합니다. 고전적인 테스트는 최종 상태에만 신경을 씁니다. 따라서 Mockist 테스트는 메소드 구현과 더 관련이 있습니다. 공동 작업자 호출의 특성을 변경하면 일반적으로 모의 테스트가 중단됩니다.
[...]
구현 변경 사항은 리팩토링을 방해합니다. 구현 변경은 기존 테스트보다 테스트를 중단 할 가능성이 훨씬 높기 때문입니다.
Fowler- Mocks는 스텁이 아닙니다