TDD não existe

Email

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?
Email
Publicado em Sem categoria por Giovanni Bassi. Marque Link Permanente.

Sobre Giovanni Bassi

Arquiteto e desenvolvedor, agilista, pai, filho, namorado, escalador, provocador.
Programa porque gosta, e começou a trabalhar com isso porque acha que trabalhar como administrador é meio chato. Por esse motivo sempre diz que nunca mais vai virar gerente de ninguém. E também porque acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é melhor que hierarquia. Mas isso é outro assunto.
Foi reconhecido  Microsoft MVP depois que alguém notou que ele não dormia a noite pra ficar escrevendo artigos, cuidando e participando do .Net Architects, gravando o podcast Tecnoretórica, escrevendo posts no blog e falando o que bem entende no twitter @giovannibassi. E por falar nisso é no twitter que conta pra todos que gerencia de projetos deve ser feita pelo time e não por um gerentes, que greves em TI são coisas sem sentido e que stored procedure com regras de negócio são malígnas.
Você já deve ter percebido (até porque está lá na primeira frase) que Giovanni é agilista. De tanto gostar disso ele trouxe os programas de certificação e treinamento  PSD e PSM da Scrum.org pro Brasil, e por causa deles, do MVP e de algum trabalho que aparece tem que ficar indo pros EUA de vez enquando, coisa que prefere não fazer. (É bem comum você ouvir ele perguntando porque a Scrum.org e a Microsoft não estão na Itália, por exemplo.)
Junto com alguns Jedis criou a Lambda3, que, apesar de ser pequena e de não ser muito comum no Brasil, insiste em fazer projetos e consultoria direito. Por causa da Lambda3 ele tem trabalhado mais do que quando era consultor independente, mas menos do que a maioria das pessoas. Quer dizer, isso se você considerar que os trabalhos junto à comunidade não são trabalho, caso contrário ele trabalha mais que a maioria das pessoas.
Recentemente ele resolveu que merecia viver melhor e ganhar uns anos de vida e desistiu de ser sedentário, fazendo algum barulho de vez em quando com os amigos no twitter com a hashtag #DotNetEmForma. Por causa do convite recente de amigos do lado Open Source (que ele respeita e admira), começou a escalar, e agora está sempre com as mãos machucadas. Mas ainda dá pra programar. Você encontra ele sempre em algum evento, como o TechEd, e o DNAD, mas também outros menos comuns para o pessoal do .NET, como a RubyConf. Nesses eventos, ou ele está vendo palestras, ou batendo papo com alguém, ou codando alguma aplicação que alguém achou que dava pra fazer durante o evento.
  • http://www.danielfonsecacastro.com.br/ Daniel Fonseca Castro

    Cara esse post daria um belo podcast!

  • http://unplugged.giggio.net/ Giovanni Bassi

    Bora fazer!

  • http://hugoestevam.blogspot.com/ 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!

  • 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é…

  • http://reverb.leandrodaniel.com/ Leandro Daniel

    Giovanni, muito interessante essa percepção.

    Abraços!

  • http://www.mgrtconsultoria.com/ 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.aniche.com.br/ 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? :)

  • http://www.evilazaro.net/ Evilázaro Alves

    Show de Post Giovanni, mudei muitos conceitos a respeito de TDD.

    Um forte abraço.

  • 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,

  • http://luizcorrea.blogspot.com/ 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…

  • 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!

  • 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".