Testes Unitários com NUnit

Fala pessoal!

As coisas têm estado bastante corridas nas últimas semanas, motivo pelo qual terminei o mês de abril com o impressionante número de 1 post. Mas em maio o objetivo é mudar isso: no mínimo 2, :)..

Nas últimas semanas tenho lido bastante sobre testes unitários, inversão de controle (e injeção de dependência), princípios SOLID e algumas outras práticas defendidas pela comunidade ALT.NET.

Apesar de testes unitários já serem tópico de atenção há muito tempo e eu ter uma clara noção de como eles funcionavam, tenho que admitir que nunca os havia utilizado na prática. Como um post do Karl Seguin, via CodeBetter, nesta semana falou do assunto também e alguns projetos na empresa seriam bastante beneficiados, pensei: é hora de dar uma pesquisada e de quebra tirar a poeira do blog!

Pra demonstrar um projeto com testes unitários básicos eu vou utilizar o NUnit. O VS2008, na edição Team System, também pode fazer testes unitários, mas minha escolha baseia-se no fato de eu não apoiar o recorrente comportamento “anti open frameworks” da MS. Além do custo do VS ser absurdo, eu realmente gostaria de poder participar de uma comunidade cada vez mais ativa sem depender da MS pra tudo. Nesse quesito é indiscutível a superioridade do Java (na verdade de sua comunidade) sobre o .NET, e pra mim grande parte desta culpa pertence à MS..

Antes de tudo, você precisa baixar os assemblies do NUnit. Pra mostrar as funcionalidades básicas do NUnit vamos criar uma solução no VS com dois projetos: uma class library para as classes do projeto e outra com nossas classes de teste. Você até pode deixar seus testes no mesmo assembly de suas classes controladoras ou de domínio, mas isto adiciona uma dependência de sua aplicação ao assembly do NUnit na hora do deploy que não é legal.

Vamos criar um exemplo clássico: uma classe calculadora. Pra simplificar as coisas por aqui, vou criar só um método: Somar. Para os demais métodos seria simplemente repetir o processo. A interface de sua classe ficaria mais ou menos assim:

7 public class Calc

8 {

9 public double Soma(double x, double y)

10 {

11 return 0;

12 }

13 }

Você pode perceber que ambos o métodos não está retornando o cálculo correto, e isto foi intencional: a idéia é que os testes primeiro falhem pra depois corrigirmos os códigos das classes, bem TDD mesmo. Pode parecer estranho num primeiro momento mas isto garante que você desenvolva código baseado em testes que você sabe que eles tem que passar, o que acaba garantindo a qualidade do seu código (imaginando que você não fique com preguiça de escrever todos os testes, é claro).

Depois da interface da classe definida, vamos escrever nossa classe de testes. Basta criar uma classe normal na class library de testes, adicionar a referência ao assembly do NUnit e criar um método TestarSoma(). Todos os métodos de teste não devem ter parâmetros nem retornar nada (void). Isto vai permitir ao NUnit executar os testes de maneira atômica, ou seja: tudo que um teste precisa para rodar é seu próprio código. Nosso método de teste ficaria mais ou menos assim:

27 [Test]

28 public void TestarSoma()

29 {

30 Calc c = new Calc();

31 double res = c.Soma(2.5, 2.5);

32 Assert.AreEqual(5, res);

33 }

Os pontos de interesse nesse trecho de código são:

  1. O attribute [Test] no topo do método: esse attribute é o que diz ao NUnit que trata-se de um teste unitário que deve ser executado. Existem outras tags que o NUnit disponibiliza, permitindo informar que uma exceção é esperada, que o método ainda não está implementado, extensões para dar Rollback automático no seu BD, etc, etc. O [Test] é o básico;
  2. A classe Assert: essa é uma classe que fica no namespace do NUnit (NUnit.Framework) que é responsável por dizer se o teste funcionou ou não: ela fornece métodos estáticos para comparar igualdade, diferença e uma série de outras possibilidades.

Antes de rodar nosso projeto com o NUnit só precisamos de mais um passo: adicionar o attribute [TestFixture] à classe de testes. Isto indica ao NUnit que esta classe possui métodos de testes. A definição de sua classe ficará assim:

9 [TestFixture]

10 public class CalcTest

Feito isto é hora de rodar nosso teste pela primeira vez. Abra o NUnit GUI na pasta de instalação ou através do menu iniciar, e através do menu File > Open Project indique a .DLL de seu projeto de testes. O NUnit identificará suas classes e métodos de teste automaticamente. Clique no botão Run e seu resultado deverá ser semelhante ao print abaixo:

nunit_erro

Pelo NUnit GUI é possível perceber que nosso único teste implementado até o momento – TestarSoma – falhou. Pelos detalhes exibidos na parte direita da tela existe um detalhamento dizendo que o valor esperado era 5, mas foi retornado 0: o que já esperávamos, pois nosso método ainda não está implementado.

O próximo passo, então, é implementar o método da classe Calc para que nosso teste passe. Para isto, vamos alterar o método Soma para retornar o óbvio:

9 public double Soma(double x, double y)

10 {

11 return x+y;

12 }

Com o método implementado, basta compilar a solução e ir novamente ao NUnit GUI (que já atualiza o assembly automaticamente). Rodando novamente o teste, percebemos pela cor verde que o teste rodou com sucesso:

nunit_sucesso

E é isso! Com isto você já tem uma noção básica de como utilizar o NUnit para construir seus testes unitários. Existem uma série de outros attributes que podem facilitar, em muito, sua vida, mas isto é assunto para um próximo post.

Use e abuse de testes unitários com o NUnit e, no caso de dúvidas ou sugestões de temas que você gostaria de ver por aqui é só entrar em contato!

Abraços, bons testes e até o próximo post!

Filipe

Anúncios

3 Responses to “Testes Unitários com NUnit”


  1. 1 cibele 04/05/2009 às 15:55

    Boa Tarde!

    Gostaria de saber onde posso fazer curso de Teste Unitário utilizando NUnit.

    Att,
    Cibele

    • 2 Michel Augusto Pasta 05/05/2009 às 08:29

      Cibele,

      a melhor forma de aprender sobre Test unitário, TDD, NUnit é pesquisando tutoriais, lendo blogs. Eu não conheço um curso para isso. Muitas vezes, a empresa responsável pelo projeto ministra cursos e presta suporte.

      [ ]s
      Michel

    • 3 José Filipe 06/05/2009 às 11:05

      Olá Cibele! Obrigado por comentar..

      Acho que o comentário do Michel é bastante pertinente, também não sei de cursos aqui no Brasil (ou mesmo fora)..

      Buscando no Google, encontrei uma ocorrência neste link.

      Se você tiver dúvidas ou quiser saber sobre funcionalidades específicas, entre em contato que vou postando por aqui, ok?

      Abraços!

      Filipe


Deixe um comentário

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




Perfil

Olá! Meu nome é José Filipe e sou o autor deste blog. Trabalho como Gerente de Desenvolvimento da todo! BPO, onde sou responsável pela manutenção e evolução de pessoas, processos e sistemas desenvolvidos em diferentes tecnologias. Atualmente curso uma especialização em Engenharia de Software pela PUCPR, em Curitiba, mas moro em Florianópolis, onde me graduei em Sistemas de Informação pela UFSC. Possuo o título de MCP e com base nas experiências do dia-a-dia espero trazer ao blog assuntos interessantes sobre arquitetura e desenvolvimento .NET..

Arquivos

Páginas

maio 2009
S T Q Q S S D
« abr   jun »
 123
45678910
11121314151617
18192021222324
25262728293031

%d blogueiros gostam disto: