TDD simples e prático, Parte II

Fala Desenvolvedores!!!

Dando continuidade à parte I da série continuaremos neste artigo com TDD, desta vez destrinchando um pouquinho mais a metodologia para escrevemos o nosso primeiro código.

O primeiro artigo foi bem simples, apenas uma breve introdução para apresentar os conceitos e alguns motivos para o uso da técnica do TDD.
Vamos agora avançar um pouco mais para ter uma visão melhor e um pouco mais profunda.

Sendo chato, parte I
Sei que é chato, mas ainda falarei um pouco de teoria neste início, para que realmente possamos entender (leia-se lembrar!) sobre alguns conceitos e motivos do uso de TDD.
Como havia dito, o TDD se baseia no seguinte ciclo:

Vamos entender um pouco sobre cada etapa:

Novo Teste
Este primeiro passo é o pilar do TDD (não brinca!). Temos uma nova funcionalidade do sistema e fazemos o processo inverso ao tradicional: Testamos e Codificamos e não Codificamos e Testamos.

No primeiro momento isto parece estranho, esquisito ou feio, mas não é. O fato de termos um teste primeiro que o código garante que daremos passos simples para a codificação da funcionalidade, afim de fazer o teste passar, ou seja, seremos “obrigados” a escrever uma implementação simples para que o teste passe.

No começo esta forma não é muito intuitiva e o gráfico de aprendizagem não é lá um dos melhores, mas com o tempo e aperfeiçoamento da técnica, esta será a forma mais intuitiva e segura de desenvolver que você encontrará.

Teste Falhando
Neste momento, acabamos de escrever o teste e não temos a implementação. Óbvio que o teste falhará, pois ele espera uma resposta que ainda não temos implementada em lugar algum.
Com um Teste falhando na nossa frente, temos um único objetivo na vida: Fazê-lo passar! Passamos para a próxima fase:

Nova funcionalidade
Já ouviu falar no KISS? “Keep It Simple, Stupid”, ou seja, devemos escrever o nosso código da forma mais simples possível. Código limpo, simples e funcional! Esta é a idéia.

Assim, neste momento vamos esquecer as Boas práticas, a Inversão de Controle, os Patterns, etc e  vamos codificar a nossa nova funcionalidade da forma mais simples possível para fazer o nosso Teste passar.
Neste momento estamos simplesmente escrevendo alguma funcionalidade que faça o teste passar (sem quebrar outros testes) e também teremos segurança na Refatoração deste mesmo código daqui a alguns minutos.

Vale lembrar também daquela sequência ótima de desenvolvimento que devemos ter na cabeça:
Código que funciona -> Código simples e limpo -> Código rápido

Agora com a nova funcionalidade implementada e o teste passando, seguimos para a próxima fase:

Refatoração
Agora sim! Você purista da programação que condenou a minha geração por eu ter falado para abandonarmos as boas práticas de desenvolvimento, agora sim pode ficar tranquilo!

Neste momento é que vamos analisar melhor aquele código que fizemos simplesmente para o nosso Teste passar. É neste momento que retiramos duplicidade, renomeamos variáveis, extraímos métodos, extraímos Classes, extraímos Interfaces, usamos algum padrão conhecido, etc. É neste momento que podemos deixar o nosso código simples e claro e o melhor de tudo: Funcional!

Temos um teste agora que indicará qualquer passo errado que podemos dar ao melhorar o nosso código. E não somente este código que acabamos de escrever.
Após algum tempo com TDD, será criada uma ¹Suite de Testes, onde poderemos refatorar sem a preocupação de atingir negativamente algum código já existente, pois já teremos Testes indicando qualquer falha.

Já ouviu falar no SRP? “Single Responsibility Principle”. Este princípio nos diz que devemos ter somente um motivo para modificar uma classe. Ou seja, ele fala sobre termos uma classe com somente uma responsabilidade.

Por que estou lembrando disso? Por que o TDD nos “força” a termos classes seguindo esta regra, pois facilita os Testes. Não podemos refatorar um trecho de código e quebrar vários Testes. Assim, este princípio acaba sendo utilizado, mesmo que você não perceba.

Pronto! Como acabamos a refatoração, o próximo passo é o próximo Teste!

Sendo chato, parte II
No último passo aplicamos a Refatoração, que é a melhoria do código. Isto se faz necessário(leia-se bom) sim em relação às boas práticas já conhecidas, porém com TDD isso se torna obrigatório!

Por que? Simples! Para escrevermos um Teste, escrevemos uma funcionalidade, mas esta funcionalidade não pode quebrar outro Teste. Ao quebrar outro Teste, temos que fazer um pequeno esforço para que o nosso novo código esteja menos acoplado ao código restante.

Viu o que aconteceu? Trocamos a forma de desenvolvimento. Em vez de projetarmos a nossa aplicação e tentarmos escrever um código (levando horas) pensando nas mudanças no futuro, já pensando nos Patterns, regras e etc, escrevemos um código de Teste que guiou a simplicidade do nosso código, que em seguida refatoramos para deixá-lo menos acoplado e com uma maior coesão, fazendo com que este código seja facilmente modificado no futuro, seja para correção de problemas ou para novas funcionalidades.

Mundanças seguras no código
Muitos desenvolvedores ainda escrevem código pensando nas modificações no futuro que este código poderia ter e acaba escrevendo um código com Factory, Singleton,  Template Method, Bridge, Strategy e todos os amigos do GoF. Este pensamento, apesar de parecer seguro, contraria os princípios da Metodologia Ágil.

Claro que o software sempre sofrerá mudanças e a nossa preocupação de hoje é:
- Prever/Escrever um código/design para modificar no futuro quando precisarmos
Mas deveria ser
- Escrever um código simples e claro, que seja fácil modificar e seguro

Kent Beck, no seu livro também comenta sobre perdermos muito tempo imaginando um Design que seja perfeito para aplicação e acabamos escrevendo um código que na maioria das vezes não era necessário.
Com TDD realmente abandonamos este pensamento, justamente por queremos que o Teste passe logo, ou seja, escrevemos o nosso código da forma mais simples possível.

Como conseguimos um código simples? -> Fazendo um Teste passar
Como conseguimos um código claro?      -> Refatorando o código após ele passar
Como conseguimos um código seguro?   -> Com Testes

Documentação para o limbo?
Não. Aquela documentação no papel, em uma wiki, em um doc, etc é desatualizada pois é muito custoso atualizá-la a cada Refatoração/Mudança de código.
A melhor documentação e mais atualizada possível é a Suíte de Testes pois ela mostra de forma simples como está funcionando o sistema naquele exato momento. Se você percorrer os testes você entenderá o que o sistema realiza.

Finalizando
Neste artigo comentamos de forma simples sobre os pontos do ciclo do desenvolvimento com TDD e também reforçamos a idéia  e os motivos para utilizá-lo.

Agora temos o conceito fixado na cabeça e adoramos TDD! No próximo artigo escreveremos algumas funcionalidades de um sistema com TDD, utilizando a Java com o JUnit. Logo mais utilizaremos também o JMock ou Mockito que também facilitará muito os nossos Testes!

Abraços Pessoal!!!

¹Suite de Testes: Basicamente é um grupo de testes do sistema. São os testes de certo módulo agrupados, onde podem ser rodados em conjunto ou separadamente.

About these ads

2 comentários

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s