
Testes componíveis deixam suítes mais rápidas e legíveis
Isolamento e composição como propriedades distintas
Kent Beck retoma duas propriedades do Test Desiderata - isolamento e composição - para mostrar que, embora pareçam equivalentes, tratam de aspectos diferentes de uma suíte de testes. Isolamento significa que cada teste cria seu próprio fixture do zero, de modo que a ordem de execução não altera o resultado. Composição, por sua vez, refere-se à capacidade de uma suíte de testes isolados, executados em conjunto, gerar confiança preditiva mesmo que nenhum teste individual seja abrangente.
O problema da redundância por cópia
Beck apresenta um exemplo em que um teste é copiado, colado e estendido repetidamente - às vezes seis ou sete vezes - resultando em testes longos e difíceis de ler. O teste estendido não pode passar se o original falhar, pois herda todas as suas asserções. Diante disso, há três opções: manter ambos os testes, eliminar o primeiro ou simplificar o segundo.
Manter ambos é redundante. Eliminar o primeiro perde especificidade - a propriedade de que, quando um teste falha, o desenvolvedor sabe exatamente onde está o problema. A solução preferida de Beck é a composição: reduzir o teste estendido para que ele não repita as asserções já cobertas pelo teste anterior, mantendo a mesma cobertura preditiva e ganhando especificidade adicional, já que o primeiro teste pode falhar enquanto o segundo passa.
O caso N x M
Beck ilustra o ganho com um exemplo de 4 formas de calcular juros e 5 formas de reportá-los. A abordagem de força bruta exigiria 20 testes. Com composição, bastam 10: 4 testes para a dimensão de cálculo, 5 para a de reporte e 1 teste que demonstra a integração entre as duas dimensões. Isso pressupõe que as dimensões sejam demonstravelmente ortogonais, o que exige reflexão e design.
Os benefícios apontados são: testes mais rápidos, mais legíveis, mais fáceis de modificar, mais específicos e menos sensíveis a mudanças estruturais.
Contraponto e resposta
Beck reconhece que desenvolvedores experientes reagem com resistência à ideia de reduzir asserções em um teste, interpretando-a como risco. Ele classifica essa reação como baseada em medo, não em princípio, e argumenta que composição não piora os testes - melhora o conjunto ao avaliar múltiplas propriedades simultaneamente.
Nos comentários, Matteo Vaccari levanta uma preocupação concreta: se houver um bug em doSomething(), o estado ao executar doSomethingElse() é desconhecido, e falhas subsequentes podem ser falsos positivos. Ele sugere alternativas como estabelecer explicitamente o estado esperado ou usar asserções de suposição (assumeTrue) para distinguir falhas reais de falhas causadas por precondições quebradas.