테스트 대상 시스템에서 클래스를 추출 할 때 단위 테스트를 리팩터링해야합니까?


13

나는 몇 가지 일을하는이 수업을 썼습니다 (아마도 이것이 단일 책임 원칙을 위반하는 것입니다). 지금은 프로젝트의 다른 부분이 필요 실현 조각 이 논리의 나는 내 원래의 시스템에서 테스트의 클래스를 추출하는 것입니다 노출거야 방법.

테스트 코드를 변경하지 않고도이 작업을 수행 할 수있을 것으로 기대하지만 완료하면 테스트가 더 이상 단위 테스트 가 아니라고 주장 할 수 있습니다. 원래 클래스 추출한 클래스를 테스트합니다 . 다시 말해, 하나의 테스트 사례가 있지만 두 개의 시스템이 테스트 중입니다.

완료 한 후 테스트 코드를 리팩터링해야합니까? IE : ExtractedClassTest를 만들고 OriginalClassTest에서 관련 테스트를 모두 이동합니까? 이것은 약간 위험 할 수있는 것처럼 보입니다. 프로세스에서 일부 적용 범위를 잃을 수 있습니다. 테스트를 이동하는 것만 큼 간단하지 않을 수 있으며 작동하는 것으로 알고 있지만 더 이상 작동하지 않을 수있는 테스트 코드를 다시 작성하게됩니다. 기타

반면에 OriginalClassTest를 그대로두면 테스트 유지 관리 문제임을 알 수 있습니다. ExtractedClass의 테스트 위치를 찾는 것은 약간 혼란 스러울 것입니다. 첫 인상은 존재하지 않는다는 것입니다. 생산 코드 리팩토링이 많으면 시간이 지남에 따라 심각한 문제가 될 수 있습니다.

저는 TDD를 처음 사용하므로 전문가의 조언을 원합니다. 감사!

답변:


7

보고 후 이 놀라운 이야기 "이안 쿠퍼 : 모든 이동 잘못을했다 TDD를,"나는 @pdr에 동의하지 않을거야. 원래 테스트 만 유지해야한다고 생각합니다. 테스트를 중단, 작성 또는 변경하지 않고 테스트중인 시스템을 리팩터링 할 수있는 능력은 우선 테스트를 작성하는 전체 목적입니다.

추출 된 클래스를 테스트하려면 동작이 아닌 구현을 테스트하고 있습니다. 결과적으로 내 코드는 나중에 리팩토링하기가 더 어려울 수 있습니다. 이러한 새로운 테스트는 동작이 여전히 작동하더라도 실패 할 수 있습니다.


6

개발 기간 동안 두 가지를 모두 갖추십시오. 이전 테스트는 아무 것도 깨지 않았 음을 보증하고 클래스를 디자인하는 데 도움이되도록 새로운 테스트 (처음부터)를 작성하십시오.

마지막에는 이전 테스트에서 없어진 것을 모두 제거하십시오. 이 분석에주의하십시오. 기능이 없어야한다고 생각하기 때문에 무언가를 제거하지 마십시오. 더 이상 필요하지 않은 이유를 자신 (또는 다른 사람 또는 고무 오리)에게 보여주십시오. 테스트를 중단하고 다른 테스트가 중단되는지 확인하십시오.

이전 테스트에 남은 것은 사례별로 취해야하지만 대부분 새로운 구조로 다시 작성해야합니다.

당신이 옳기 때문에, 당신은 유지 보수의 악몽을 남기고 싶지 않습니다. 그러나 이전보다 경로 범위를 줄이고 싶지는 않습니다.


1
방금이 작업을 수행했으며 꽤 인상적이라고 말해야합니다. 변경 사항이 간단했지만 테스트를 올바르게 리팩터링하고 동일한 적용 범위를 유지하는 데 약 2 시간이 걸렸습니다. 내가 확인하고 있는지 확인하기 위해 새로운 테스트에 몇 가지 추가 테스트를 추가해야한다는 것이 분명해졌습니다. 클래스를 추출하고 두 시스템을 테스트하는 것이 더 효율적이라고 생각합니다. 이 정도의 작업으로 테스트를 잘못 작성 했습니까?
Daniel Kaplan

1
@tieTYT : 거기에 앉아서 당신을 보지 않고는 대답하기가 어렵습니다. 때때로 TDD는 가치보다 더 많은 일처럼 보입니다. 다른 경우에는 왜 귀찮게했는지 생각 나게합니다. 그리고 다른 때는 더 힘들게 만드는 것이 당신입니다. 차이를 말하는 법을 배우는 것은 TDD를 잘 배우는 데있어 큰 부분입니다.
pdr

이 경우에 테스트를 리팩토링하지 않았을 가능성이 있다고 생각합니까? 그렇지 않을 것 같습니까?
Daniel Kaplan

1
@tieTYT : 그렇습니다. 불가능 해
pdr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.