O Que É Desenvolvimento Orientado a Testes (TDD)?
Desenvolvimento orientado a testes é um fluxo de trabalho onde você escreve um teste que falha para o comportamento desejado antes de escrever o código que o faz passar.
Desenvolvimento orientado a testes, ou TDD, inverte a ordem usual do trabalho. Em vez de escrever código e depois acoplar testes, você descreve o comportamento desejado como um teste que falha, então escreve apenas o código suficiente para fazê-lo passar, e então limpa. A disciplina produz uma rede de segurança de testes como efeito colateral da construção de funcionalidades.
O ciclo red-green-refactor
O TDD roda em um loop apertado. Primeiro você escreve um teste que falha porque a funcionalidade ainda não existe (red). Então você escreve o código mais simples que o faz passar (green). Por fim você refatora o código e os testes para remover duplicação e melhorar a clareza, mantendo o teste verde o tempo todo. Cada loop é pequeno, frequentemente de apenas alguns minutos.
Por que escrever o teste primeiro
Escrever o teste primeiro força você a definir o que "pronto" significa antes de começar. Ele o direciona para unidades pequenas e testáveis e interfaces claras, porque código difícil de testar geralmente é difícil de usar. O teste que falha também prova que o teste pode falhar, então um resultado verde depois realmente significa algo.
Um exemplo prático
Suponha que você precise de uma função que soma dois números. Primeiro você escreve um teste afirmando que add(2, 3) retorna 5. Você o roda e ele falha porque add não existe. Você escreve a função, roda o teste, e ele passa. Então você adiciona um teste para números negativos e repete.
test("adds two numbers", () => {
expect(add(2, 3)).toBe(5);
});
function add(a, b) {
return a + b;
}No que o TDD é bom e ruim
- Encaixe forte: lógica pura, parsers, cálculos e unidades bem definidas.
- Encaixe mais fraco: trabalho exploratório de UI ou código cuja forma ainda é desconhecida.
- Ele produz cobertura de regressão rápida quase de graça.
- É uma ferramenta de design tanto quanto de teste.
TDD e integração contínua
Como o TDD deixa para trás uma suíte de testes rápida e determinística, ele combina naturalmente com CI. Cada push roda os mesmos testes que o desenvolvedor rodou localmente, então o build verde no pull request reflete comportamento real e intencional, em vez de um palpite otimista.
Mantendo o loop rápido
O TDD só funciona quando o loop de feedback permanece curto, tanto localmente quanto em CI. Quando a suíte cresce, rodá-la em runners mais rápidos e em paralelo mantém cada push abaixo de um minuto ou dois. A Latchkey roda essa suíte em runners gerenciados rápidos e a divide entre eles para que o check verde chegue antes que o desenvolvedor perca o contexto.
Principais conclusões
- TDD significa escrever um teste que falha antes do código que o satisfaz.
- O loop red-green-refactor constrói cobertura de regressão conforme você avança.
- Ele também serve como ferramenta de design que favorece unidades pequenas e testáveis.