Em um cenário de desenvolvimento ágil, sem uso de TDD, o programador geralmente não conta com um modelo de classes em forma de diagramas – como outras metodologias pesadas. Por isso é comum a modelagem ser feita apenas mentalmente, em algum outro formato (rascunho em papel de pão?) ou até mesmo diretamente no código. As classes, operações e atributos vão surgindo conforme a necessidade, e são constantemente alterados e implementados até a conclusão da tarefa associada. Eventualmente, alguns testes de unidade são implementados baseando-se nas classes já prontas.
Este tipo de abordagem implica em alguns problemas, entre eles:
- o programador não tem segurança em saber quando uma implementação acabou;
- o programador não precisa implementar a classe de forma que ela fique desacoplada das demais;
- o programador tende a não desenvolver para a interface e sim para a implementação;
- métodos não coesos (fazem mais ou menos do que deveriam fazer);
- nomes de atributos e operações não representam adequadamente a funcionalidade.
- as classes devem ser desacopladas, senão o teste não pode ser executado;
- os métodos são bem coesos, ou seja, fazem somente o necessário para o teste passar;
- o programador sabe exatamente quando concluiu uma implementação, pois o teste passou;
- o programador consegue validar rapidamente uma alteração que pode ter causado um impacto em outras unidades, apenas rodando um conjunto de testes;
- operações e atributos possuem nomes claros e representam exatamente o que fazem.
- Crie a classe de teste e o primeiro teste
- Nesse ponto o programador deve pensar em como será a assinatura do método testado. O fato de ter que escrever um teste para o método, faz com que, tanto o nome quanto os parâmetros de entrada e saída sejam bem claros e coesos.
- Compile o teste
- O teste não vai compilar. Neste momento, crie a classe e a declaração do método. Recompile e rode o teste. O teste deve falhar, pois o método testado ainda não está implementado.
- Implemente o código testado de modo que o teste falhe
- O objetivo do teste é detectar defeitos, e essa fase é importante para averiguar se o teste está cumprindo seu papel. Geralmente codificar para que o método testado retorne um valor errado é o suficiente. Rode o teste e veja o teste falhar.
- Agora corrija o código, de forma que o teste passe
- Implemente o suficiente para o teste passar. Você deve garantir que o teste exija o suficiente. Se precisar implementar mais do que o necessário para o teste passar, provavelmente seu teste não está bom o suficiente, ou seu método não está coeso. Neste caso, refaça o teste ou corrija a implementação do código testado.
- Faça alguma refatoração necessária e reexecute os testes
- Na fase anterior nos preocupamos apenas em fazer o teste passar. Nessa etapa, faça uma revisão no código e veja se precisa de alguma refatoração. Em seguida rode todos os testes construídos até agora para certificar-se de que a refatoração não quebrou algum outro código.
Antes que me perguntem: TDD não é burocrático e demorado?. Não. Usar
TDD não implica em aumentar o tempo de desenvolvimento. Desconsiderando
o tempo de adaptação de sua equipe, a tendência é que o desenvolvimento
com TDD aumente consideravelmente a produtividade, e, consequentemente,
a segurança e qualidade dos produtos desenvolvidos. Essa é a
experiência de quase toda equipe de aderiu ao TDD, e provavelmente sua
equipe só vai se sentir confortável com a idéia quando efetivamente
aplicar os conceitos da metodologia.
fonte: www.olharcritico.com
Nenhum comentário:
Postar um comentário