방법론 인 TDD가 다음과 같은 경우를 어떻게 처리하는지 잘 모르겠습니다. 파이썬에서 mergesort 알고리즘을 구현하고 싶다고 가정 해보십시오. 나는 글로 시작
assert mergesort([]) === []
테스트는 실패
NameError : 이름 'mergesort'가 정의되지 않았습니다
그런 다음 추가
def mergesort(a):
return []
그리고 나의 시험은 통과한다. 다음으로 추가
assert mergesort[5] == 5
내 테스트는 실패
AssertionError
내가 통과하는
def mergesort(a):
if not a:
return []
else:
return a
다음으로 추가합니다
assert mergesort([10, 30, 20]) == [10, 20, 30]
그리고 지금이 패스를 만들려고 노력해야합니다. 나는 mergesort 알고리즘을 "알고"다음과 같이 작성한다
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
그리고 이것은 실패
NameError : 이름 '병합'이 정의되지 않았습니다
이제 질문이 있습니다. merge
TDD를 사용하여 실행을 시작하고 구현 을 시작하려면 어떻게 해야합니까? 내가이, 이루어지지 않은 "걸려"에 대한 테스트를 실패하지 않았을 수 있기 때문에 것 같다 mergesort
, 까지 통과하지 것이다 merge
완료! 이 테스트가 중단되면 TDD 반복을 구성하는 동안 "녹색"이 아니기 때문에 실제로 TDD를 수행 할 수 없습니다 merge
.
다음 세 가지 추악한 시나리오에 갇혀있는 것처럼 보이며 (1) TDD 커뮤니티가 선호하는 방법 중 하나 또는 (2) 내가 놓친 또 다른 접근법이 무엇인지 알고 싶습니다. 나는 밥 삼촌 TDD 연습 몇 가지를 보았고 전에 이런 사례를 본 것을 기억하지 않습니다!
다음은 세 가지 경우입니다.
- 다른 테스트 스위트를 사용하여 다른 디렉토리에 병합을 구현하십시오.
- 헬퍼 기능을 개발할 때 친환경에 대해 걱정하지 말고 실제로 통과하려는 테스트를 수동으로 추적하십시오 .
mergesort
해당 통화 에서 라인을 주석 처리 (GASP!)하거나 삭제하십시오merge
. 그런 다음merge
일 을 마치고 다시 넣습니다.
이것들은 모두 나에게 어리석게 보입니다 (또는 내가 잘못보고 있습니까?). 누구든지 선호하는 접근법을 알고 있습니까?
mergesort
입니다. 이를위한 "올바른"방법을 찾고 있다면 mergesort
알고리즘을 일련의 단위 테스트에 매핑하는 것 외에 다른 방법은 없습니다 . 즉 그들은 mergesort
실제로 하는 일을 반영해야한다 .
mergesort
빨강-녹색 리 팩터에서 설계가 자연스럽게 나타날 것으로 예상되는 경우 기존 지식을 기반으로 프로세스를 안내하지 않는 한 발생하지 않습니다 mergesort
.
merge
에서 "리팩토링"단계에서만 발명해야합니다. merge
테스트 통과를 위해 메소드를 도입 할 수있는 경우 mergesort
먼저 merge
메소드 없이 테스트를 통과하도록하십시오 . 그런 다음 merge
메소드 를 도입하여 구현을 리팩토링하십시오 .
mergesort
, 이미 잘 정의 된 알고리즘이므로이 발견 프로세스는 필요하지 않으며, 이미 디자인으로 알고있는 것을 일련의 단위 테스트에 맵핑하는 문제가됩니다. 아마도 최상위 레벨 테스트에서는 테스트중인 메소드가 정렬되지 않은 콜렉션을 승인하고 정렬 된 콜렉션을 리턴한다고 가정합니다.