Pular para o conteúdo

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.

FaseO que se fazO que ela protege
vermelhoum teste que falhaque o teste consegue falhar — um teste que nunca falhou não prova nada
verdeo mínimo para passarque o código existe por causa de um comportamento pedido
refatorarmelhorar a forma, sem mudar o comportamentoque 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#

PodeNão pode
extrair subtotal de totalmudar o que total devolve
trocar o laço por pipelineacrescentar comportamento “já que estou aqui”
renomear o que é internomudar teste e código no mesmo passo

Continue em Testes unitários e Regressão.