Não estou claro como o TDD, a metodologia, lida com o seguinte caso. Suponha que eu queira implementar o algoritmo mergesort, em Python. Eu começo escrevendo
assert mergesort([]) === []
e o teste falha com
NameError: o nome 'mergesort' não está definido
Eu adiciono
def mergesort(a):
return []
e meu teste passa. Em seguida eu adiciono
assert mergesort[5] == 5
e meu teste falha com
AssertionError
com que passo
def mergesort(a):
if not a:
return []
else:
return a
Em seguida, adiciono
assert mergesort([10, 30, 20]) == [10, 20, 30]
e agora tenho que tentar fazer isso passar. Eu "conheço" o algoritmo mergesort, então escrevo:
def mergesort(a):
if not a:
return []
else:
left, right = a[:len(a)//2], a[len(a)//2:]
return merge(mergesort(left)), mergesort(right))
E isso falha com
NameError: o nome 'mesclar' não está definido
Agora, aqui está a pergunta. Como posso fugir e começar a implementar merge
usando o TDD? Parece que não posso porque tenho esse teste "pendurado" não realizado e com falha mergesort
, que não será aprovado até que merge
seja concluído! Se esse teste persistir, nunca poderei realmente executar o TDD porque não serei "verde" durante a construção das iterações do TDD merge
.
Parece que estou preso aos três cenários feios a seguir e gostaria de saber (1) qual deles a comunidade TDD prefere ou (2) há outra abordagem que estou perdendo? Eu assisti várias orientações do tio Bob TDD e não me lembro de ter visto um caso como esse antes!
Aqui estão os 3 casos:
- Implemente a mesclagem em um diretório diferente com um conjunto de testes diferente.
- Não se preocupe em ser ecológico ao desenvolver a função auxiliar, apenas acompanhe manualmente os testes que realmente deseja passar.
- Comente (GASP!) Ou exclua as linhas
mergesort
nessa chamadamerge
; depoismerge
de trabalhar, coloque-os de volta.
Tudo isso me parece bobo (ou estou vendo isso errado?). Alguém sabe a abordagem preferida?
mergesort
. Se você está procurando a maneira "certa" de fazer isso, não há outra, além de ser preciso sobre o mapeamento do mergesort
algoritmo para uma série de testes de unidade; ou seja, eles devem refletir o que mergesort
realmente faz.
mergesort
design saia naturalmente do refator vermelho-verde, isso não acontecerá, a menos que você guie o processo com base no seu conhecimento existente mergesort
.
merge
deve ser inventado apenas no estágio de "refatoração". Se você perceber que esse merge
método pode ser introduzido para passar no teste, mergesort
primeiro faça seus testes sem merge
método. Em seguida, refatorar sua implementação, introduzindo o merge
método
mergesort
, como já é um algoritmo muito bem definido, esse processo de descoberta não é necessário e torna-se uma questão de mapear o que você já sabe ser o design para uma série de testes de unidade. Presumivelmente, o seu teste de nível superior afirma que seu método em teste aceita uma coleção não triados e retorna um ordenado um ...