quarta-feira, julho 04, 2007

Teste Unitário e Code Coverage com Visual Studio

Ultimamente tenho visto muita gente falar sobre testes unitários, metodologias ágeis, garantia de qualidade, mas implementar o tal do teste unitário que é bom mesmo, são poucas empresas que conheço que fazem isso de verdade.

Quando digo que são poucas, não estou me refirindo a você abrir o Visual Studio, criar um projetinho de teste e criar um método simples para testar apenas o "caminho feliz" do seu método, estou falando de você planejar os seus testes unitários antes e criar vários métodos de testes para cobrir todas, ou pelo menos a maioria, das situações que o seu método possa executar.

Isso engloba em testar range de valores, parametros opcionais, se as exceções são levantadas corretamente e por aí vai. Se for preciso utlizar Mock Objects, ótimo, vamos fazer isso também, mas é extremamente importante que você faça métodos de testes que sejam eficientes e não apenas para dizer que está utilizando testes unitários na sua aplicação.

Um recurso muito útil presente no Visual Studio (edições pra Developer e Tester) é o Code Coverage. Esse recurso ligado junto com os testes unitários permite ao usuário acompanhar visualmente quais trechos do código foram testados ou não.

Vamos ver um exemplo de como ele funciona:

1. Vamos criar um projeto do tipo Class Library e adicionar uma classe Calculadora como o exemplo abaixo:


public class Calculadora
{
public static float Dividir(float d1, float d2)
{
if (d2 == 0)
{
throw new DivideByZeroException();
}
else
{
return d1 / d2;
}
}

public static int Soma(int a, int b)
{
return a + b;
}
}

2. Em seguida , vamos adicionar um projeto do tipo Test Project e adicionar uma classe chamada CalculadoraTest com o seguinte código:


[TestClass]
public class CalculadoraTest
{
[TestMethod]
public void DivisaoComumTeste()
{
float resultado = Calculadora.Dividir(6, 3);
float esperado = 2;

Assert.AreEqual(esperado, resultado);
}
}


Veja que a classe de teste possui apenas um método e não está cobrindo a situação de divisão por zero, e nem o método Soma. Isso não quer dizer que o método não funcione, mas ele não foi testado.

Se rodarmos esse teste, teremos o seguinte resultado:


Até aí nada de muito interessante, a janela mostra apenas que o teste foi executado com sucesso. O grande barato é quando ligamos o Code Coverage o colamos os testes unitários para rodar junto.


Para habilitar o Code Coverage, vá no arquivo localtestrun.testrunconfig da sua solução e você verá a seguinte tela:




Marque o Assembly CodeCoverageSample.dll e mande rodar os testes novamente. Quando terminar os testes, acesse o menu Test/Windows/Code Coverage Results e veja que coisa linda :-)



O Visual Studio te dá a porcentagem de código testado agrupados por métodos, classes, namespaces e assemblies e além disso marca no código por quais trechos ele passou ou não.

Dessa forma fica muito fácil visualizar que temos que escrever mais métodos de testes para testar a situação da divisão por zero e para garantir que o método de soma está funcionando corretamente.

Agora que já conhecemos o Code Coverage, é só definirmos uma meta para o nosso projeto (80, 90, 100% de cobertura) e brigar com o seu gerente pra ele alocar tempo para você criar métodos de testes que cubram todo o seu código :-)

Um grande abraço

André Dias



2 comentários:

Emerson disse...

Olás, como vai?

Parabéns pelo post André. Estou começando com teste unitário no VE e não poderia ter um post melhor.

Abraço.

Ramilo Neves disse...

Fala André!
Perfeito o post!
Você tem algum livro para indicar?
Estou começando um trabalho agora e gostaria de me aperfeiçoar mais!
Att,
Ramilo Neves