Todo bom desenvolvedor sabe que testes automatizados são importantes. Ainda assim, boa parte dos desenvolvedores não entende o valor do TDD (Test Driven Development). Argumentam que o importante é testar, não importa quando. É um argumento pertinente, e eu mesmo sou culpado de tê-lo usado algumas vezes no passado. Mas será que está certo?

Analisando o argumento, notamos que quem o faz entende que testar é algo importante. Isso já é um grande passo. No Ágiles 2009 foi citado que apenas 2% dos desenvolvedores fazem testes, ou seja, se você faz testes você pode estar fazendo parte de uma minoria que sabe fazer software direito. Testes trazem grandes benefícios, garantem que o código da aplicação funciona hoje, e vai continuar funcionando no futuro. Testes feitos antes ou depois garantem isso da mesma forma. Diante disso, argumenta-se: porque testar antes?

Porque tal argumento é falho?

É falho porque entende TDD como uma abordagem de testes. TDD utiliza testes para dirigir o desenvolvimento da aplicação, mas o foco não são os testes, mas sim o design da aplicação. Testes escritos antes do código da aplicação, antes de serem testes, são especificações. Depois do primeiro verde do ciclo do TDD e antes da refatoração, as especificações podem ser chamadas de testes, mas até então elas não testavam nada, elas especificavam um comportamento que deveria existir, mas não existia ainda.

Há uma diferença muito grande entre testar antes e testar depois: quando você testa antes você está especificando, e depois a especificação vira um teste. Quando você testa depois você está garantindo que algum código que você escreveu funciona, você está somente testando, não especificando.

Testes feitos antes garantem que o código criado vai ser testável, e, provavelmente, vai ser mais desacoplado do que seria se os testes tivessem sido escritos depois. Especificações focam na maneira com que uma API vai ser usada, e por este motivo a API tende a ficar também mais simples de usar, já que o uso e os nomes das entidades (classes, métodos, eventos, etc) são todos definidos sob a perspectiva do usuário da API, e não do construtor dela. São definidos de fora, e não de dentro. Outro grande benefício é ter muito claro como se usa uma API: está com dúvida, olhe as especificações.

Quando você para para observar um desenvolvedor praticando TDD, você nota outra coisa interessante: ele raramente usa o depurador. Isso acontece porque praticamente não há necessidade de utilizá-lo, já que, se um teste falhou, só pode ter sido por causa do código que você escreveu nos últimos 5 minutos, já que antes os testes passavam. Rapidamente você encontra o problema. Quando você faz testes depois, frequentemente há a necessidade de usar o debugger.

Diante disso, volto ao título do Post: TDD não existe, porque não são testes que dirigem o desenvolvimento, mas sim especificações, e há uma grande diferença, porque nem sempre testes são especificações. Um nome mais adequado seria Specification Driven Development, ou Specification Driven Design (SDD).

Encerrando, é sempre bom dizer:

  • Se você nunca praticou TDD e pratica testes, não conhece o benefício de uma API desenvolvida sob a perspectiva do usuário, e os benefícios que isso trás. Experimente.
  • Se você não faz testes, você está com um problema gigantesco em mãos. Como diz o Uncle Bob, desenvolvedor que não testa é como cirurgião que não lava as mãos. Quando você não está testando você está deixando de realizar uma das práticas mais importantes da sua profissão, o que o coloca, efetivamente, na condição de amador. Que tipo de profissional você quer ser?

Postado na(s) categoria(s) pelo Giovanni Bassi em 19 de outubro de 2009 às 09:01 | Tags:

Comentários


outubro 19. 2009 10:18
Daniel Fonseca Castro
Cara esse post daria um belo podcast!

http://www.danielfonsecacastro.com.br/http://www.danielfonsecacastro.com.br/


outubro 19. 2009 14:06
Giovanni Bassi
Bora fazer!

http://unplugged.giggio.net/http://unplugged.giggio.net/


outubro 19. 2009 23:19
Hugo Estevam
Muito legal o post e serve para reflexão. O problema é que como os gestores pagam por hora acabam achando que utilizar TDD vai levar mais tempo, ou seja será mais caro. Com isso acabam capando essa idéia sem se dar por conta que os benefícios serão enormes em termos de custos mais adiante na vida util do projeto.
O lance é colocar isso na cabeça dos gestores, dos desenvolvedores até acho fácil!

http://hugoestevam.blogspot.com/http://hugoestevam.blogspot.com/


Brazil Chan
outubro 20. 2009 08:30
Chan
Muito bom o post, eu tento fazer testes onde trabalho... mas acabo fazendo depois ... vou tentar seguir o conselho e praticar TDD..
Aqui é exatamente como o Hugo falou. Mas de quem é a culpa ? De quem vende ou de quem compra ? Quem compra quer pra ontem, e quem vende tem que fazer pra ontem. Já vi empresa perder projetos por não aceitar um prazo absurdo imposto por quem compra...
Mas acredito que as empresas estão amadurecendo, e cada vez mais vão oferecer maior qualidade nos softwares desenvolvidos, e os que compram vão cada vez mais exigir maior qualidade ao invés daquela velha historia de que é pra ontem.
Até...

no site


outubro 20. 2009 10:34
Leandro Daniel
Giovanni, muito interessante essa percepção.

Abraços!

http://reverb.leandrodaniel.com/http://reverb.leandrodaniel.com/


outubro 20. 2009 22:36
Fábio
O Mercado de software ainda é muito amador.Testes unitários são raros, no máximo, temos testes caixa preta. Quando questiono algumas fábricas sobre testes unitários, so vejo interrogações. Quando pego uma especificação e vou validar, no ponto de vista de arquitetura da aplicação, antes de qualquer crítica no modelo, pergundo como o profissional irá realizar testes unitários no que foi projetado, logo ele percebe o quanto a aplicação está com alto acoplamento e baixa coesão, e aí o oriento a melhorar o design, utilizando boas práticas de oo, design patterns etc. Acho que "testar" antes, trás a vantagem de especificar o que realmente irá ser utilizado e com design flexível. Concordo plenamente contigo, os testes quando criados e não rodam, são validações da especificação enviada pelo cliente. Parabéns.

http://www.mgrtconsultoria.com/http://www.mgrtconsultoria.com/


outubro 22. 2009 00:22
Mauricio Aniche
Oi Giovanni,

TDD ainda tem muitos outros benefícios além dos que você citou no seu post. Como vc sabe, minha dissertação de mestrado trata basicamente sobre isso, e quem sabe, daqui a algum tempo, ela não sirva pra motivar ainda mais as pessoas a praticar TDD? Smile

http://www.aniche.com.br/http://www.aniche.com.br/


outubro 22. 2009 15:06
Evilázaro Alves
Show de Post Giovanni, mudei muitos conceitos a respeito de TDD.

Um forte abraço.

http://www.evilazaro.net/http://www.evilazaro.net/


Brazil Alessandro
outubro 22. 2009 17:14
Alessandro
Giggio,
você saberia me informar onde posso achar material sobre TDD, como por exemplo, o que deve ser testado em um projeto MVC (apenas os controllers), como fazer o teste, apenas o VS é suficiente, ou vou precisar de algum framework de MOK (qual o melhor)?

Att,

no site


outubro 22. 2009 18:41
Luiz Corrêa
Giovanni, o BDD já não engloba mais ou menos isso que vc está definindo por SDD? Onde o BDD entraria?

E sem dúvida daria um belo podcast, ou apenas um da série: Boas Práticas no Desenvolvimento de Software...

http://luizcorrea.blogspot.com/http://luizcorrea.blogspot.com/


Brazil Flávio Borges
outubro 28. 2009 23:53
Flávio Borges
Giovanni,

muito bom o seu post e muito interessante seu ponto de vista.

Realmente, esse assunto "testes" é muito importante e muitas vezes é negligenciado ou mesmo acaba ficando "de lado" pelos gestores.

A idéia de SDD em detrimento ao TDD também é bastante interessante e acaba atingindo dois problemas negligenciados: Testes e especificação.


Falou!

no site


Brazil Antonio Jr
novembro 8. 2009 20:35
Antonio Jr
Giovanni,

Esse fim de semana estive ministrando um treinamento para uma turma de aspirantes a Trainee da empresa para a qual trabalho. Comecei pegando pesado e mostrando para a garotada que testar antes não tem nada a haver com testes e sim com o design da aplicação que será desenvolvida. Para a minha surpresa e dos participantes , a experiência foi muito boa. O pessoal entendeu os benefícios dessa abordagem. Eu vejo que difícil é convencer os desenvolvedores experientes que acham que acertam sempre da primeira vez.
Valeu pelo post. è mais uma fonte pra tentar convencer os "cabeca dura".

no site

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  março 2010  »
seteququsedo
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in