Faço parte de uma equipe de desenvolvedores que trabalha com muitas outras equipes para manter e aprimorar um aplicativo em uso há pelo menos 15 anos. Quando foi construído e projetado, o TDD era inédito.
O aplicativo é razoavelmente estável e raramente encontramos um erro de interrupção do programa, mas fazemos a média de um ou dois erros por semana que reduzem seriamente a qualidade do serviço. Esses bugs levam uma eternidade para serem encontrados e corrigidos, principalmente por causa do apontamento do dedo, e o único teste que temos é o teste de interface. Como há muito tempo perdido procurando onde o bug está antes que ele possa ser corrigido, eu e outro desenvolvedor planejamos propor o Desenvolvimento Orientado a Testes. Em breve, haverá uma nova revisão, e gostaríamos de ver testes de unidade quase completos realizados nos novos módulos. Também planejamos sugerir a criação de unidades de teste para qualquer código que precisarmos alterar que seja legado (ou seja, correção de erros ou implementação de recursos ), mas não para gastar tempo desenvolvendo casos de teste para código que não causou problemas.
Para mim, isso parece razoável. Este mês, tivemos um bug que levou mais de duas semanas para corrigir, mas poderia ter sido identificado antes da implantação se o teste de unidade tivesse sido feito. Mas, para nossos gerentes, parece que eles vão gastar mais dinheiro.
Como convencer nossos clientes de que desejam gastar o dinheiro em testes de unidade e desenvolvimento orientado a testes? Existem estudos que mostram o ROI dos testes de unidade?
fonte
Respostas:
Incorporação direta do TDD completo em um código legado, o projeto de manutenção é uma venda muito difícil. Uma abordagem que vi funcionar muito bem é essa. Para cada erro que entra, crie um teste não unitário automatizado que demonstre o erro. Por "não-unidade", quero dizer algo que pode tocar muitas partes do sistema, atingir bancos de dados e sistema de arquivos, etc. - mas por "automatizado", quero dizer, é executado sem interação humana. Este é o tipo de teste que você desejará em seu conjunto de regressão em qualquer caso. Escrevê-lo realiza muitas coisas: faz com que você torne o código testável, mesmo que nesse nível muito grosseiro, e expõe você à constelação de código que pode ter algo a ver com o bug, por isso o educa e informa sobre material muito especificamente relevante.
Mas esse não é o fim. Quando esse teste estiver em execução e em vermelho (demonstrando o erro no código), reserve um tempo para descobrir o que está errado (você deve fazer isso, de qualquer forma). Mas não conserte ainda. Depois de isolar o que você acha que é o problema - escreva uma unidadeteste que demonstra esse problema. Agora você tem algo com o qual pode trabalhar (e, não por acaso, pode ter que refatorar um pouco mais para uma testabilidade ainda maior). Corrija o erro. Assista ao teste de unidade aprovado. Talvez apresente alguns casos extremos; obtenha essa unidade - a que lhe custou apenas duas semanas - sólida, limpa e bem testada. Agora execute o teste de regressão e observe-o passar (é claro que, se isso não acontecer, você terá mais pesquisas e trabalhos em nível de unidade - faça uma iteração até que também passe). Verifique tudo. O que você tem? Testes de regressão para código com falha anteriormente. Testes de unidade para código com falha anterior. Código de trabalho que estava falhando. Código melhor projetado, porque agora é mais testável do que era. Melhor confiança em sua base de código,
Não é TDD "puro". Mas demonstra resultados rapidamente e melhora a qualidade do seu código ao longo do tempo. Os resultados ajudarão você a obter adesão da gerência.
fonte
Na minha empresa, eu apenas segui o método "apenas um grunhido" da JoelOnSoftware e comecei a escrever testes de unidade sempre que normalmente eu simplesmente hackeava algum tipo de aplicativo de console descartável. Comecei a fazer as coisas muito mais rapidamente com versões mais estáveis e fui notado por isso. Quando perguntado o que estava fazendo, expliquei que havia começado a usar o TDD e a escrever testes de unidade sempre que modificava o código antigo ou escrevia qualquer novo código. Meus colegas desenvolvedores começaram a ficar curiosos e começaram a usar os testes de unidade integrados. Eu não acho que exista um bom argumento para escrever testes para trabalhar com código legado, mas se você puder concluir que escrever testes automatizados é mais rápido e mais conveniente do que escrever espaguetes de hack de console, desenvolvedores inteligentes seguirão adiante.Os outros benefícios que resultam em software de maior qualidade também estarão lá, mas a chave para obter o acesso do desenvolvedor é mostrar que isso facilita a vida deles. No que diz respeito aos negócios, o fato de resultar em um software melhor e provavelmente levar menos tempo para ser entregue do que antes deve ser mais do que suficiente para convencê-los.
fonte
Primeiro, sua atitude e seu senso de sinceridade pelo valor da qualidade agregados ao dinheiro do cliente devem ser apreciados. E aqui estão meus pensamentos sobre como você pode convencer seu gerente e cliente:
Existe outra maneira, e é tentar ingressar no seu gerente para participar das Conferências Ágeis que acontecem por aí. Certamente vale a pena assistir.
Se você acha que nada funciona, siga em frente ... junte-se ao lugar que mais lhe convier. Sinceramente, foi isso que eu fiz. Quando tudo falhou, segui em frente;)
E saiba quais testes de unidade depois de escrever o código não são realmente TDD, mas esse sempre pode ser o primeiro passo. Se encaixa tão bem aqui pelo menos.
Desejo-lhe boa sorte e sucesso!
fonte