Coding Dojo Floripa

Desenvolvimento Ágil

Introdução ao Desenvolvimento Orientado a Testes (TDD)

Posted by Ivan Sanchez em Terça-feira, Novembro 7, 2006

Test-Driven Development (TDD) ou Desenvolvimento Orientado a Testes é uma maneira diferente de escrever software. A diferença entre esta abordagem e a que você provavelmente está acostumado é que com TDD você vai evoluindo seu código aos poucos, conforme vai explorando o problema com o uso de testes automatizados escritos antes da solução sequer existir.

Algumas vantagens desta abordagem são:

  • Incentiva a simplicidade: como a solução vai surgindo pouco a pouco, a tendência é que não se perca tempo com aquilo que não tem certeza que será usado em seguida. Expressões como “You Ain’t Gonna Need It (YAGNI)” e “Keep It Simple, Stupid (KISS)” são recorrentes quando se está programando orientado a testes.
  • Aumenta a confiança no código: o sistema funciona de uma determinada maneira porque existem testes que foram utilizados durante sua criação e validam o que foi criado. E se ainda assim algum erro surgir, um novo teste é criado para reproduzí-lo e garantir que depois de solucionado ele não irá se repetir.
  • Ajuda como documentação: os testes quando bem definidos são mais simples de ler que o código e, embora nem sempre sirvam como uma especificação para o usuário final, eles são uma fonte eficiente para entender o que o software faz. Além disso, esta documentação sempre estará atualizada com a aplicação.
  • Facilita refactorings: quanto mais testes existem no sistema, maior é a segurança para fazer refactorings. Um erro causado por algum refactoring dificilmente vai passar desapercebido quando um ou mais testes falharem após a mudança.

Em TDD, um teste é um pedaço de software. A diferença entre teste e o código que está sendo produzido é que os testes têm 2 funções principais:

  • De especificação, ou seja, definir uma regra que seu software deve obedecer
  • De validação, ou seja, verificar que a regra é obedecida pelo software

Geralmente os testes são criados com algum framework do tipo xUnit (jUnit, nUnit Test::Unit etc) , mas também podem ser feitos num nível de funcionalidades (através de softwares como o FitNesse e Selenium) . Estas ferramentas servem basicamente para organizar os testes e facilitar na criação das verificações.

O processo de criação de programação orientado a testes é simples:

  1. Escreva um teste que falhe. Pense no que o código deve fazer, descreva o contexto e defina quais são as verificações que precisam ser feitas. Não há um limite no número de testes, então quanto menos coisa cada teste descrever/verificar, melhor. No início também não é preciso se preocupar se a classe/método ainda não existe. Pense primeiro no teste e só depois que este estiver pronto crie o esqueleto de código necessário para que ele compile e falhe ao rodar.
  2. Faça o teste passar. Agora chegou o ponto crucial: escreva o mínimo de código para que o teste passe. Controle o instinto natural do programador de tentar prever tudo que o código vai fazer e apenas faça o teste passar. Mesmo que tenha certeza que o código deve fazer mais coisas, fazer os testes passarem deve ser a única preocupação agora.
  3. Refatore. Uma vez que o teste passou, verifique o que no código pode ser melhorado. Geralmente para um teste passar é preciso inserir duplicação através de constantes (técnica conhecida como Fake It). Agora é a hora de melhorar o código e remover as duplicações, lembrando que os testes devem continuar passando.

Estes 3 passos são repetidos até que não se consiga pensar em novos testes, o que indica que a funcionalidade está pronta.

About these ads

27 Respostas to “Introdução ao Desenvolvimento Orientado a Testes (TDD)”

  1. […] Nossa intenção é desenvolver orientado a testes, então surge a pergunta: por onde começar? Como já sabemos, o primeiro passo para criação de código usando TDD é criar um teste que falhe. Embora o primeiro teste pareça sempre o mais complicado para se escrever, depois de algum treino ele acaba se tornando tão simples quanto os demais. Isso porque não há mesmo muita diferença entre eles. […]

  2. Boa tarde! será que você teria alguma indicação de leitura sobre fitnesse para mim. Estou tendo problemas com o tutorial que se encontra em http://www.fitnesse.org, e queria encontrar alguma alternativa.

    Obrigado

  3. Olá Paulo,

    Não conheço nenhuma documentação boa sobre FItnesse além da oficial: http://www.fitnesse.org/FitNesse.UserGuide

    Todavia, se sua intenção é testar aplicações web, aconselho usar o Selenium (http://www.openqa.org/selenium/), que é a ferramenta que adotei depois de muito bater a cabeça com o FitNesse e com seu HtmlFixture.

    O Selenium possui uma extensão para o Firefox (Selenium IDE) que permite “gravar” e mexer nos testes (que por sinal são meras tabelas HTML) que é muito boa para começar a fazer os testes.

    Espero ter ajudado e qualquer outra dúvida estou à disposição :-) E obrigado pela visita

  4. André Silva said

    Olá,

    É a primeira vez que leio algo sobre esse assunto (TDD) e nunca imaginei que isso existisse. Porém tenho algumas dúvidas que, se puder me responder, me ajudará muito. Primeiro, o TDD tem alguma coisa a ver com o SOA (Arquitetura Orientada a Serviço)? Eu posso usar TDD para programar em PHP, ASP.Net ou C#? Para isso, qual versão do Selenium eu devo baixar (Core, IDE ou RC)?

    Grato,
    André.

  5. André,

    Respondendo as suas perguntas:

    “Primeiro, o TDD tem alguma coisa a ver com o SOA (Arquitetura Orientada a Serviço)?”

    Não. TDD é uma maneira de se construir software, independente da arquitetura que está sendo utilizada.

    “Eu posso usar TDD para programar em PHP, ASP.Net ou C#? Para isso, qual versão do Selenium eu devo baixar (Core, IDE ou RC)?”

    Sim. Porém aconselho a começar usando ferramentas do tipo xUnit (phpUNit, NUnit etc), pois acredito que é mais fácil começar a aprender TDD fazendo tudo num nível de classes do que de funcionalidades.

    Quanto ao selenium, você pode começar baixando o Core para aprender como a ferramenta funciona e como criar os testes. Depois dê uma olhada nas outras ferramentas e veja se alguma facilita o seu trabalho.

    Espero ter ajudado :-)

    Abraço

  6. heyder said

    Ivan Sanchez,

    Estava querendo saber se vc já testou o selenium RC mas a versão selenese?
    se vc não conhece ela é usada para rodar os html de testes que vc monta no selenium IDE ou no Core

    abraços

  7. Olá Heyder,

    Nunca usei o Selenese, mas já li sobre a ferramenta há um tempo atrás. Aparentemente ela facilita bastante para rodar os testes do Selenium junto com os do jUnit!

    Se você conhecer mais material interessante a respeito do seu uso eu gostaria de ver. Valeu pela dica :-)

  8. Ronaldo said

    Olá, sou estudante de informática e estou começando a me interessar por programas de testes, porém ainda estou leigo com essas ferramentas, possuo apenas teorias, gostaria de apresentar um pequeno trabalho sobre o funcionamento do fitnesse, vcs tem alguma formade ajudar, já tenho o tutorial http://www.fitnesse.org/FitNesse.UserGuide

  9. Ronaldo,

    Para mostrar um exemplo do uso do FitNesse, eu aconselho utilizar a HtmlFixture:

    http://fitnesse.org/FitNesse.HtmlFixture

    Com ela você pode escrever testes para web sites, então basta criar um (pode ser um site dinâmico ou não) e especificar como este deve funcionar através das tabelas do FitNesse conforme o exemplo.

    Espero que isso ajude. Se precisar de mais alguma ajuda é só falar…

  10. fabio said

    Boa tarde,

    Eu gostaria de saber se para eu aprender script, lsl(linguagem de programação do second life) eu necessito aprender java? Por onde eu poderia começar e o que aprender de java? Me disseram que por o lsl ser voltado a orentação a eventos e o java a orientação a objetos seria mais facil eu aprender depois o lsl aprendendo java ou c++, o que vc acha?

  11. Toninho Eleotério said

    Boa Tarde!
    Estou começando a ler sobre TDD agora. Preciso conhecer o assunto pois vou fazer a 1ª parte do TCC sobre TDD.
    Gostei muito das informações contidas aqui, mas tenho algumas dúvidas que gostaria de sanar, por favor. Éo seguinte:
    1) Supondo que vou criar um teste para uma aplicação que vou construir, de onde vem as classes que eu vou criar os testes?

    2) Preciso continuar utilizando documentos de requisitos?

    3) TDD é uma prática?
    4) O que é mais indicado e melhor para levantar os requisitos do cliente?

    Muito Obrigado!
    T+

  12. Olá Toninho,

    Respondendo as perguntas…

    1) Se você está testando algo que ainda não existe, isto significa que as classes a serem testadas são criadas a medida que os testes vão evoluindo. Isto faz sentido para você?

    2) Você pode continuar usando documentos, embora o uso de uma ferramenta como Fitnesse provavelmente vai diminuir a necessidade deles. Lembre-se: quanto mais documentos estáticos você possuir, mais disciplina para mantê-los atualizado você vai precisar. Já com testes você é obrigado a mantê-los atualizados se quiser vê-los passando sempre.

    3) Na prática sim. Porém você também pode encarar TDD como uma maneira diferente de encarar problemas, ou seja, uma mudança de atitude, e não um conjunto de ações específicas.

    4) Levantamento de requisitos não faz parte de TDD, porém o uso de User Stories para levantar requisitos normalmente ajuda na hora de se pensar em testes para determinada funcionalidade.

    Espero que eu tenha ajudado um pouco.

    Se ainda tiver dúvidas pode continuar mandando :-)

    Abraço

  13. Toninho Eleotério said

    Bom dia!
    Obrigado pelas respostas.
    Continuo com dúvidas:
    Vamos imaginar que estou em uma Escola para fechar um contrato para desenvolvimento de um sistema. Eu preciso conhecer as regras do negócio, saber como funciona uma escola, quais classes vão ser criadas e etc. Como deve ser adquirido esse conhecimento? Nos métodos tradicionais, são realizadas entrevistas com os envolvidos no trabalho (professores, funcionários, diretor) e desta forma, as informações são anotadas ou gravadas. Posteriormente é feito um documento, onde eu posso me referenciar para desenvolver o trabalho.
    Como é esse passo em TDD?
    O cliente precisa estar do lado do desenvolvedor quando ele cria os testes, ou precisa pelo menos acompanhar de tempos em tempos?
    Sabe se existe algum livro sobre TDD em português?
    Obrigado!

  14. Olá Toninho,

    Sua dúvida não está relacionada somente a TDD, mas em como organizar seu projeto de software como um todo. Vejamos:

    Se você está partindo para uma abordagem Ágil, você provavelmente levanta o requisitos usando User Stories [1]. Estas histórias contêm os principais cenários que você precisa, e ao mesmo tempo não dizem muito sobre as classes que deverão existir. Para estimar um projeto (e fechar contratos) você só deveria entender as regras de negócio, e para isso posso afirmar com segurança que User Story é bem melhor do que diagrama de classes.

    TDD entra na história quanto você começa a implementar o sistema, e os primeiros casos de teste (de alto nível, veja) já são facilmente identificado através das User Stories. Estes testes (de Aceitação) devem guiar o desenvolvimento, e as classes também poderão ser criadas baseadas nessa informação.

    Quanto à participação do cliente, esta é interessante para que todos saibam se estão no caminho certo. Por isso ele deve ajudar a criar a user stories e verificar se os testes de aceitação satisfazem todas as regras de negócio que pareçam relevantes.

    Não conheço nenhum livro específico sobre TDD em português, mas aconselho a ler o livro de eXtreme Programming do Vinícius Teles [2] que trata bastante do assunto. O site deles [3] também é uma boa pedida.

    Espero ter ajudado.

    Abraço!
    Ivan

    [1] http://www.improveit.com.br/xp/praticas/historias
    [2] http://www.improveit.com.br/livroxp
    [3] http://www.improveit.com.br/

  15. Toninho Eleotério said

    Olá Ivan!
    Boa tarde!
    Hoje de manhã, olhei sua resposta às minhas dúvidas. Muito obrigado pela atenção.
    Gostaria de dizer que os links que você me indicou, foram de grande utilidade para meu conhecimento:

    http://www.improveit.com.br/xp/praticas/historias

    [2] http://www.improveit.com.br/livroxp
    [3] http://www.improveit.com.br/

    Num dos links indicados por você. Encontrei uma dissertação sobre XP de VINÍCIUS MANHÃES TELES. A dissertação tem 181 páginas. Me interessei tanto pelo assunto que li todas as 181 páginas de hoje de manhã até agora. Só lembrando que meu assunto de interesse principal nem é o XP e sim o TDD, que também é uma técnica de desenvolvimento ágil. Mas como os assuntos são de mesmo tema, achei interessante ler toda a dissertação. Para confessar a verdade o que me motivou mesmo foi o assunto ser extremamente interessante e agora estou olhando para XP com outros olhos. Muito obrigado e parabéns pela a atitude de ajudar. Valeu mesmo.
    Abs.
    Toninho Eleotério

  16. Valeria said

    Oi Toninho, poderia enviar a dissertação para meu email?

  17. 2Ch said

    Ivan, excelente post!
    Vai me ajudar muito a introduzir TDD na minha empresa!

    Foi também muito interessante a troca de informações que você fez nos comentários com o amigo que fez a TCC no TDD.

    Grande abraço!

  18. […] Introdução ao desenvolvimento orientado a testes (TDD) http://dojofloripa.wordpress.com/2006/11/07/introducao-ao-desenvolvimento-orientado-a-testes/ […]

  19. […] Introdução ao Desenvolvimento Orientado a Testes (TDD) – Conding Dojo Floripa […]

  20. Muito bom o artigo. É a primeira vez que leio sobre o assunto e achei interessante. Tenho uma pergunta, como eu faria a integração das partes com o todo? e de que forma isso facilita o trabalho em equipe?

  21. […] Povo, segue abaixo um artigo sobre Desenvolvimento Orientado a Testes bem interessante tirado do Coding Dojo Floripa. […]

  22. Rosa Carvalho said

    Boa tarde,

    Estou agora a começar a utilizar o Fitnesse. No entanto, encontrei algumas dificuldades na edição das páginas, essencialmente no que se refere à criação de uma ligação para um documento que não esteja no fitnesse. O que eu quero é criar, numa página do fitnesse, um link que tenha ligação directa a um documento, por exemplo em word, que esteja guardado num servidor interno. Alguém me sabe dizer como posso fazer isso?

    Obrigada.

  23. Boa noite!

    Meus amigos e eu estamos desevolvendo um software de carona (sistema responsável por cadastrar pessoas que oferecem e pessoas que precisam de carona) e escolhermos desenvolver o mesmo em TDD. Nós temos MUITA teoria mas nenhuma prática.

    Estamos desenvolvendo o mesmo em asp.net

    Nós não temos idéia de como aplicar o tdd na prática.

    Não sei sei se minha explicação foi clara.. mas tem como você “clariar” minha visão com relação a TDD na prática mesmo ou até mesmo se tiver algum programinha para mostrar.. qualquer coisa ajuda.. haha.

    O nosso sistema já esta pronto mas não aplicamos TDD, somente conhecimentos de programação.

    Grato pela atenção.

  24. […] basicamente em detectar as falhas e corrigi-las durante o desenvolvimento do software. Segundo Ivan Sanches no TDD você vai evoluindo seu código aos poucos, conforme vai explorando o problema com o uso de […]

  25. […] basicamente em detectar as falhas e corrigi-las durante o desenvolvimento do software. Segundo Ivan Sanches no TDD você vai evoluindo seu código aos poucos, conforme vai explorando o problema com o uso de […]

  26. Jessica Matos said

    Oi,

    Me interesso muito pela metodologia TDD, estou iniciando um TCC sobre o assunto alem do livro clássico “test driven development by example” do Kent Beck você têm alguma sugestão de livro para complementar meu estudo?

  27. Hoje em dia em recomendo muito o “Growing Object Oriented Software, Guided By Tests”:

    http://www.growing-object-oriented-software.com/

    Ele mostra a criacao de um sistema “real” do zero, abordando questoes mais avancadas que nao sao cobertas pelo livro do Kent Beck.

Deixar uma resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

WordPress.com Logo

Está a comentar usando a sua conta WordPress.com Log Out / Modificar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Log Out / Modificar )

Facebook photo

Está a comentar usando a sua conta Facebook Log Out / Modificar )

Google+ photo

Está a comentar usando a sua conta Google+ Log Out / Modificar )

Connecting to %s

 
Seguir

Get every new post delivered to your Inbox.

%d bloggers like this: