TDD — vermelho, verde, refatorar
O ciclo, passo a passo, construindo um carrinho de compras — e o que cada fase protege.
TDD não é escrever teste antes. É escrever um teste, vê-lo falhar pelo motivo certo, fazer o mínimo para ele passar, e só então melhorar o código — com o teste segurando o comportamento enquanto a forma muda.
| Fase | O que se faz | O que ela protege |
|---|---|---|
| vermelho | um teste que falha | que o teste consegue falhar — um teste que nunca falhou não prova nada |
| verde | o mínimo para passar | que o código existe por causa de um comportamento pedido |
| refatorar | melhorar a forma, sem mudar o comportamento | que a limpeza não quebrou nada |
1. Vermelho: o primeiro comportamento#
dataforge
// O teste vem primeiro, e a acao existe so o bastante para compilar.
action total(itens):
yield 0
assert total([]) is 0
// O proximo teste e o que vai falhar:
// assert total([{"preco": 10, "qtd": 3}]) is 30
out "passo 1: o caso vazio passa; o proximo vai falhar pelo motivo certo"2. Verde: o mínimo#
dataforge
action total(itens):
soma := 0
cycle i in itens:
soma += i["preco"] * i["qtd"]
yield soma
assert total([]) is 0
assert total([{"preco": 10, "qtd": 3}]) is 30
assert total([{"preco": 10, "qtd": 3}, {"preco": 5, "qtd": 2}]) is 40
out "passo 2: verde"3. O próximo comportamento puxa o próximo teste#
A regra nova — cupom de 10% acima de 100 — entra do mesmo jeito: primeiro o teste, depois o código.
dataforge
action subtotal(itens):
yield sum(itens >> morph i: i["preco"] * i["qtd"])
action total(itens, cupom := ""):
s := subtotal(itens)
given cupom is "DEZ" and s bigger 100:
yield round(s * 0.9, 2)
yield s
// Os testes antigos continuam — e sao eles que autorizam a refatoracao.
assert total([]) is 0
assert total([{"preco": 10, "qtd": 3}]) is 30
assert total([{"preco": 60, "qtd": 2}], "DEZ") is 108.0
assert total([{"preco": 60, "qtd": 1}], "DEZ") is 60
out "passo 3: a regra nova, e as antigas seguraram a mudanca"Refatorar: o que pode e o que não pode#
| Pode | Não pode |
|---|---|
extrair subtotal de total | mudar o que total devolve |
| trocar o laço por pipeline | acrescentar comportamento “já que estou aqui” |
| renomear o que é interno | mudar teste e código no mesmo passo |
Continue em Testes unitários e Regressão.