Por: Sebastião Júnior
17318 visualizações
Tempo leitura: 5 min
Muito dos programadores que nunca praticaram o TDD (Test Driven Development) sempre perguntam: Será que realmente diminui erros? Aumenta a confiabilidade do código? Aumenta ou diminui a produtividade?
Toda e qualquer prática em engenharia de software é muito difícil de avaliar e chegar a uma conclusão exata sobre seus ganhos e benefícios. Nos últimos anos, a comunidade acadêmica vem rodando diversos experimentos para tentar mostrar, de maneira empírica, que TDD realmente ajuda no processo de desenvolvimento de software.
O que é TDD?
O Desenvolvimento Orientado a Testes ou TDD (Test Driven Development) é uma prática da engenharia de softwares que pode ser utilizada durante a produção de softwares. Ela consiste em um ciclo curto de repetições onde o desenvolvedor escreve casos de testes automatizados que possam tanto validar um requisito quanto implementar uma nova funcionalidade.
Utilizando TDD durante o desenvolvimento de um software a rotina adotada pela maioria dos programadores muda um pouco. Estamos acostumados a codificar e depois criar processos de testes. Já usando TDD, os testes devem ser feitos primeiro, só após a escrita dos testes que o código que implementa o requisito deve ser escrito.
O processo é bem simples de entender:

Imagem 1: Test Drive Development
- Escreva um teste que falhe: Analise um dos requisitos do sistema, pense nas verificações que o teste deve fazer para que sua funcionalidade seja validada. Escreva um teste que falhe. Caso a funcionalidade passe pelo teste, sua permanência é opcional, pois indica que esta já foi satisfeita pelo sistema.
- Faça o teste passar: Com uso de baby steps codifique o mínimo possível para que ele passe pelo teste mesmo que seu método retorne apenas o valor esperado pelo teste. O objetivo aqui e passar o teste. Seja Simples.
- Refatore o seu código de teste: Deve-se refatorar o código de teste desenvolvendo novos testes de modo que cubra mais possibilidades de erros. O Código deve continuar atendendo ao requisito e passando pelo testes.
Esse processo é repedido várias vezes até que o código que está sendo testado seja menos propenso a erros. É importante lembrar que a cada refatoração do código os testes devem ser rodados novamente para que eles possam estar sempre atualizados com seu código de produção. Esta etapa é muito importante, pois testes desatualizados podem causar mais dores de cabeça do que contribuírem.
Onde devo criar os testes?
Atualmente a maioria das linguagens possuem bibliotecas e frameworks próprios para a realização de testes. Por exemplo: Java possui JUnit, Python possui o unittest e outras linguagens também possuem seus respectivos módulos de testes.
Vantagens da utilização
- Incentiva a Simplicidade: Ao utilizar baby steps na criação do código faz com que ele fique mais limpo e simples. Como a solução vai surgindo incrementalmente, a tendência é não perdemos tempo com códigos desnecessários.
- Aumento da confiabilidade: Por estar passando por testes de validação frequentemente, o código se torna mais confiável e menos propenso a bugs.
- Ajudam como documentação: Quando bem definidos, servem como documentação para o entendimento sobre alguma funcionalidade do sistema.
- Facilita Refactorings: A cada refatoração os testes são rodados novamente, dificilmente uma refactoring que tem um erro passará pelos testes. Ou seja, se algum método foi alterado e esta alteração inseriu algum erro no código, este erro será detectado por algum teste criado.
Dicas para iniciar com TDD
Verificar em quais pontos aplicar: Para começar, verifique quais métodos são mais interessantes de serem testados. Escolha os métodos mais relevantes no sistema ao invés de sair aplicando TDD em todo o projeto.
Não faz sentido aplicar sempre: Não se sinta obrigado aplicar testes em todos os métodos. Alguns métodos nativos da linguagem já foram bem testados pelos seus desenvolvedores e não a necessidades de testá-los.
Uso de baby steps: Não tenha pressa, codifique passo a passo e aumente o ritmo conforme você se sinta à-vontade, evite códigos muito complexos.
É pouco provável que os testes cubram todo o sistema: Se seu sistema não tem 100% de cobertura de código não quer dizer que ele não está bem testado.
Resultado de pesquisa
Um estudo feito por George e Williams mostrou que, apesar de TDD poder reduzir inicialmente a produtividade dos desenvolvedores mais inexperientes, o código produzido passou entre 18% a 50% mais em testes caixa-preta do que códigos produzidos por grupos que não utilizavam TDD. Esse código também apresentou uma cobertura entre 92% a 98%. Uma análise qualitativa mostrou que 87.5% dos programadores acreditam que TDD facilitou o entendimento dos requisitos e 95.8% acreditam que TDD reduziu o tempo gasto com debug. 78% também acreditam que TDD aumentou a produtividade da equipe. Entretanto, apenas 50% acreditam que TDD ajuda a diminuir o tempo de desenvolvimento. Sobre qualidade, 92% acreditam que TDD ajuda a manter um código de maior qualidade e 79% acreditam que ele promove um design mais simples.
Conclusão
Utilizando TDD podemos ver uma melhora significativa no processo de desenvolvimento. Principais pontos a serem destacados: confiabilidade, simplicidade na codificação, facilidade de refatoração e identificação de bugs.
O processo de implantação requer um tempo de adaptação para os programadores, a idéia de escrever teste antes do código de produção pode demorar um pouco a ser digerida por programadores que não tem esse habito.
Bibliografia
- CUNHA C.; BASSI G.; CAVALCANTE V. Podcast 14: Test Driven Development. http://podcast.dotnetarchitects.net/2010/07/podcast-14-test-driven-development/ .Acesso em:03 de Julho. 2013
- BASSI G.; TDD não existe. http://blog.lambda3.com.br/2009/10/tdd-nao-existe/ .Acesso em:03 de Julho. 2013
- ANICHE , M. TDD realmente ajuda?. Disponivel em: http://www.aniche.com.br/2010/04/tdd-realmente-ajuda/. Acesso em: 03 de Julho. 2013.
- Beck, K. Test-Driven Development by Example, Addison Wesley – Vaseem, 2003
- George, B., Williams, L., An Initial Investigation of Test- Driven Development in Industry. ACM Symposium on Applied Computing. Melbourne, Florida, USA, 2003.
Fonte: http://dinnitec.dinnisoft.com.br
Data da publicação:
08/06/2014
-
Sebastião Júnior
DINNI Soluções em Sistemas
Tecnólogo em Análise e Desenvolvimento de Sistemas pela FAFISM. Desenvolvedor de Software pela empresa Dinni Soluções em Sistemas.