O design teste-primeiro é uma prática de criação concorrente de testes de desenvolvedor e de código de implementação, com alto nível de detalhamento.
No design teste-primeiro, o desenvolvedor escreve primeiro uma pequena parte de um teste de desenvolvedor e, em seguida, escreve código suficiente apenas para fazer esse teste de desenvolvedor compilar e executar. Então ele escrever um pouco mais do teste e acrescenta código suficiente para fazer com que esse novo teste compile e execute com sucesso. Este ciclo pode durar de 30 segundos a cinco minutos. Raramente alcança dez minutos. Em cada ciclo, os testes vêm em primeiro lugar. Uma vez que um teste de unidade seja feito, o desenvolvedor vai para o próximo teste até que não haja mais testes a serem escritos para a implementação do item de trabalho que está atualmente em desenvolvimento.
A prática do design teste-primeiro altera a forma como o desenvolvedor pensa. Os testes não são escritos como uma conseqüência. Ao invés, os testes de desenvolvedor são escritos como parte da forma de construção de software diária e instantânea.
Quais são as vantagens do design teste-primeiro?
- Os pressupostos no design são analisados antes da implementação de código. Para escrever os testes de desenvolvedor, um exame deve ser feito no comportamento de cada pedaço de código a ser escrito, comportamentos corretos e incorretos devem ser definidos. De certa forma, escrever os testes antes do código pode ser considerado como uma versão de design detalhado.
- As unidades de código concebidas para serem testadas no início são mais limpas e menos acopladas.
- Os erros são encontrados cedo. Os erros ou brechas nos requisitos e no design são identificados antes da codificação começar quando poderia ser mais tentador avançar baseado em suposições.
- Uma clara estratégia de colaboração entre o desenvolvedor e as pessoas responsáveis pelos requisitos, pela arquitetura e pelo design é posta em prática. Durante a criação dos testes, deverá haver uma reunião a respeito do que foi especificado. Depois disso, a implementação pode continuar com a confiança de que existe uma visão compartilhada do que o código deve fazer.
- Existem critérios inequívocos para a conclusão do código. Quando os testes executam com sucesso, o código está funcionando, conforme especificado. As dimensões de qualidade não-funcionais podem ser tratadas separadamente, mas existe um momento bem definido em que o código se comporta corretamente.
- A técnica direciona o desenvolvedor para trabalhar em pequenos incrementos com retorno rápido e de qualidade. A qualquer momento, o desenvolvedor estará apenas a um teste de ter o código livre de erro.
- Existe uma separação das preocupações e esforços entre obter código funcional e melhorar a qualidade do código que já está funcionando corretamente. A separação destas duas áreas de preocupação fornece foco e suporte de gestão de tempo para um desenvolvedor que em um passo faça a implementação passar no teste o mais simples possível e, em um passo posterior, busque por áreas para melhoria.
|