Olá Pessoal, hoje vou falar um pouco sobre Programação Orientada a Teste ou TDD, essa é uma das técnicas que vem sendo muito utilizadas dentro dos ambientes de desenvolvimento e que também está dentro da filosofia agile e XP(Extreme Programming) e sua utilização vem crescendo cada vez mais.
Essa filosofia de desenvolvimento traz muitos benefícios, entre eles estão o desenvolvimento de um produto final melhor, uma boa organização de código, e um dos pontos mais importantes é que quando houver uma grande mudança no sistema você pode rastrear quais são os efeitos destas mudanças por meio dos teste feitos anteriormente.
Para dar uma introdução de como funciona o TD vou dar um exemplo de como desenvolver um Placar de Futebol.
Primeiro Cliclo
Primeiro Cliclo
O TDD é desenvolvido em ciclos. Em primeiro lugar desenvolvemos o a Interface do placar. Essa interface pode ser vista como o projeto do Placar, onde vão ser definidas as funções e variáveis.
Para isso vamos criar um projeto Class Library no VS2010, com o nome de Placar, vamos criar uma Interface IPlacar uma classe Placar que vai implementar a interface criada, o projeto e os códigos devem ficar semelhantes as figuras abaixo:
namespace Placar { public interface IPlacar { int jogador1 { get; } int jogador2 { get; } string getPlacarAtual(); void addJogador1(); void addJogador2(); void clearPlacar(); } }
namespace Placar { class Placar: IPlacar { public int jogador1 { get; set; } public int jogador2 { get; set; } public string getPlacarAtual() { throw new NotImplementedException(); } public void addJogador1() { throw new NotImplementedException(); } public void addJogador2() { throw new NotImplementedException(); } public void clearPlacar() { throw new NotImplementedException(); } } }
Após montado o projeto básico, vamos começar a montar nosso primeiro teste, para isso vamos criar um novo projeto Class Library chamado Placar.Test, que é onde vamos testar nosso placar, para realizar os teste eu utilizo o NUnit que pode ser baichado aqui. para que o Nunit possa achar nossos teste adicione na referência do projeto a DLL do NUnit (nunit.framework) que está na pasta da instalação do NUnit. Criamos a classe de teste, com os primeiros teste:
namespace Placar.Teste { [TestFixture] public class PlacarTest { [Test] public void PlacarZerado() { IPlacar placar = new Placar(); Assert.AreEqual("0", placar.jogador1); Assert.AreEqual("0", placar.jogador2); Assert.AreEqual("0x0", placar.getPlacarAtual()); } } }
Com isso pronto podemos começar a testar. Abra o NUnit na aba file click em Open Project e procure pela DLL do Placar.Test, click em Run e terá o resultado do teste:O primeiro teste falhou, pois ainda não foi implementada a função getPlacarAtual e as variaveis não estão com o valor "0".
Segundo Cliclo
O segundo ciclo consiste em implementar as falhas do primeiro teste e rodar o teste novamente, após feita a implementação temos o código abaixo:
namespace Placar { public class Placar: IPlacar { public int jogador1 { get; set; } public int jogador2 { get; set; } public Placar() { jogador1 = 0; jogador2 = 0; } public string getPlacarAtual() { return jogador1.ToString() + "x" + jogador2.ToString(); } public void addJogador1() { throw new NotImplementedException(); } public void addJogador2() { throw new NotImplementedException(); } public void clearPlacar() { throw new NotImplementedException(); } } }
Fazendo o teste novamente vemos que occorre tudo como o esperado:
Terceiro Ciclo
Agora montamos o segundo deste, onde adicionamos pontos a jogador1 e ao jogador2 também zeramos o placar:
namespace Placar.Teste { [TestFixture] public class PlacarTest { [Test] public void PlacarZerado() { IPlacar placar = new Placar(); Assert.AreEqual(0, placar.jogador1); Assert.AreEqual(0, placar.jogador2); Assert.AreEqual("0x0", placar.getPlacarAtual()); } [Test] public void PontuaJogadores() { IPlacar placar = new Placar(); placar.addJogador1(); placar.addJogador2(); Assert.AreEqual("1x1", placar.getPlacarAtual()); placar.clearPlacar(); Assert.AreEqual("0x0", placar.getPlacarAtual()); } } }
Executando o teste temos o resultado:
Da mesma forma fazemos a implementação do Placar e aplicamos o teste novamente:
namespace Placar { public class Placar: IPlacar { public int jogador1 { get; set; } public int jogador2 { get; set; } public Placar() { jogador1 = 0; jogador2 = 0; } public string getPlacarAtual() { return jogador1.ToString() + "x" + jogador2.ToString(); } public void addJogador1() { jogador1++; } public void addJogador2() { jogador2++; } public void clearPlacar() { jogador1 = 0; jogador2 = 0; } } }
Esse post foi apenas uma introdução, de como fazer um desenvolvimento orientado a testes. No começo pode ser um pouco trabalhoso, mas com o andamento do desenvolvimento esse processo pode até facilitar, pois tudo que foi desenvolvido até um dado ponto foi bem testado, e a cada mudança que você faz no programa os testes anteriores checam se houve alguma alteração no comportamento geral do sistema.
Por hoje é só, no próximo post vou aprofundar um pouco mais no NUnit e suas funções.Abraço.