Faça a bola rolar no TDD

10

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?

Malfist
fonte
11
é tarde demais para TDD; Consulte "Trabalhando com Legacy Code", de Michael Feathers
Steven A. Lowe
Etapa 1. Pesquisar estouro de pilha. Isso já foi solicitado. E respondeu. Exemplos: stackoverflow.com/search?q=starting+tdd
S.Lott 07/07

Respostas:

6

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.

Carl Manaster
fonte
Ótima sugestão, mas acho que o OP está procurando um argumento mais convincente que justifique o tempo extra necessário para implementar esse tipo de abordagem.
22711 Bernard
Talvez eu precise reformulá-lo, então. O que tentei expressar foi que a maior parte do esforço descrito é necessária de qualquer maneira - o tempo extra é muito modesto, para benefícios significativos. Me desculpe se isso não estava claro.
Carl Manaster 07/07
Está claro para mim como desenvolvedor, mas sei que o gerenciamento geralmente precisa de um argumento muito convincente (ou seja, justificar a despesa).
22711 Bernard Bernard
Foi o que sugeri no meu segundo parágrafo da pergunta. Escreveríamos TDD para "novo código" e escreveríamos casos de teste para qualquer código legado que alterássemos por solicitação de correção ou recurso.
Malfist 7/07
3

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.

Morgan Herlocker
fonte
0

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:

  • Colete as métricas de bugs que você estava corrigindo, digamos nos últimos 6 meses, e o tempo mínimo, médio e máximo que levou para você consertar um bug.
  • Para todos os erros que você corrigiu ou tem contexto, tente escrever testes de unidade que cobrem essas áreas.
  • Para os bugs em que você está trabalhando e aqueles em que estará trabalhando, tente escrever testes de unidade nessas áreas antes mesmo de fazer alterações. Em seguida, escreva o código para descobrir a causa e corrigi-lo. Veja se ele quebra algum caso de teste existente. Se sim, explique e ajude seus colegas a entender a importância dos testes de unidade.
  • Depois que todos os desenvolvedores entenderem a importância dos testes de unidade, peça que eles continuem fazendo o que você faz há tantos dias / semanas.
  • À medida que o tempo passa, a produtividade das equipes deve melhorar na medida em que o gerente e os clientes ficariam surpresos com a taxa de melhoria na produtividade e na qualidade do código. É um pouco demorado, mas vale a pena tentar.

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!

karthiks
fonte