Vinicius Quaiato

{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}

Testando com NUnit


NUnit

Para quem trabalha com Visual Studio e costuma escrever testes é comum o uso do MSTests: o framework para unit tests integrado a ele.Algumas versões do Visual Studio, porém, não possuem estas ferramentas, mas isso não te impede de escrever seus testes.NUnit é um framework para unit testing. Inicialmente portado do JUnit, atualmente é 100% escrito em C# e é possível utilizá-lo com todas as linguagens do .NET.Além da situação onde não se possui o MSTests, o NUnit é válido ser utilizado em muitos outros casos, pois é um framework bastante maduro e possui muitas facilidades e possibilidades na escrita dos testes.Não farei um comparativo entre ele e o MSTests, mas mostrarei algumas features que ele possui.

O download e instalação

O download e instalação são bastante simples, você pode optar entre um instalador MSI, um zip ou baixar o fonte e compilar, confira tudo aqui: http://www.nunit.org/index.php?p=downloadFaça o download do MSI, e siga o melhor padrão NNF.

Criando um projeto no VisualStudio

Como eu possuo o Visual Studio 2010 com todas as ferramentas de testes e mais ainda as adicionadas pelo R#, eu vou remover as referências para o MSTests do meu projeto:Remover referencia MSTests

E vamos adicionar a referência para o NUnit:Adicionar referencia NUnit

A DLL do NUnit estará em "Program Files\NUnit x.x\bin.net 2.0\framework\nunit.framework.dll".

Escrevendo os testes

A escrita dos testes é bem simples. Vamos utilizar os atributos [TestFixture] em uma classe, meio que para dizer que "aqui estão meus testes". E em cada método de teste vamos utilizar o atributo [Test]. Diferença com o MSTests onde usávamos [TestMethod].aspx).Existem vários métodos que podem ser utilizados para asserções. Abaixo vou demonstrar alguns deles, e acho que são bem explicativos. Notem que existem métodos assertivos que não existem no MSTests mas que facilitam bastante a vida. É o caso do Contains para trabalharmos com coleções. Greater e Less para trabalharmos com comparação de valores.

[TestFixture]
public class UsandoNUnitTests{    [Test]    
public void AreEqual()    {        Assert.AreEqual(0, 1 - 1);
    }
    [Test]    
public void Contains_Com_Inteiros()    {        Assert.Contains(10, new List<int> { 2, 5, 99, 100, 10 }
);
    }
    [Test]    
public void Contains_Com_String()    {        Assert.Contains("Vinicius", new List<string> { "Vinicius", "Janynne", "Robinho" }
);
    }
    [Test]    
public void Greater()    {        Assert.Greater(1000, 100);
    }
    [Test]    
public void Greater_Com_Strings()    {        Assert.Greater("viniciuz", "vinicius");
    }
    [Test]    
public void IsEmpty()    {        Assert.IsEmpty(new Stack<datetime>());
    }
    [Test]    
public void IsNotEmpty()    {
var queue = new Queue<string>();
    queue.Enqueue("Vinicius");
    queue.Enqueue("Janny");
    Assert.IsNotEmpty(queue);
    }
    [Test]    
public void Less()    {        Assert.Less(10, 34 * 100 / 3 + 9);
    }
    [Test]    
public void That_AtLeast_GreaterOrEqual()    {        Assert.That(20, Is.AtLeast(10));
    }
            [Test]    
public void That_String_Starting()    {        Assert.That("vinicius", Is.StringStarting("v"));
    }
    [Test]    
public void That_Is_Not_Equal_To()    {        Assert.That(20, Is.Not.EqualTo(19 + 2));
    }
}
</string></datetime></string></int>

Reparem nos 3 últimos testes, nas linhas 49 a 65 que utilizamos Assert.That e dentro da chamada do método utilizamos alguns helpers que tornam a leitura dos testes bastante interessantes.No primeiro caso, na linha 52 dizemos algo como "Confirme para mim que 20 é pelo menos maior ou igual a 10". Isso é bastante legível.Na linha 58 temos algo como "Confirme para mim que 'vinicius' é uma string iniciando com 'v'". Clever hun?!E na linha 64 temos "Confirme para mim que 20 não é igual a 19+2".Existem várias outras contraints (é assim que é chamado esse tipo de asserção) que podem ser utilizadas, confira mais sobre elas aqui: http://www.nunit.org/index.php?p=constraintModel&r=2.5.5

Executando os testes dentro do Visual Studio

Para executarmos os testes eu poderia simplesmente utilizar meu teste runner dentro do Visual Studio, como mostra a figura abaixo:Executando testes do NUnit dentro do Visual Studio

Executando os testes com o NUnitTests

Outra forma de executar os testes é com o teste runner do NUnit. Para isso abra o NUnitTests que foi instalado na máquina. Utilize o menu File -> Open Project e selecione a DLL do projeto que criamos no Visual Studio:Carregando DLL dos testes no NUnitTests

Feito isso os nossos testes aparecerão no NUnitTests:DLL com testes carregada no NUnitTests

Clicando no botão Run nossos testes serão executados. Veja um exemplo com um teste falhando:Teste falhando com NUnitTests

O NUnitTests nos mostra informações de quantos testes passaram, quantos falharam, quantos foram inconclusivos, ignorados, o tempo de execução, etc.No caso de um teste com falha ele nos dá informações sobre o que deveria acontecer e o que aconteceu. Além de no painel inferior mostrar aonde a falha aconteceu. Bastante interessante.Quando eu corrigir meu teste e recompilar o projeto automagicamente o NUnitTests irá recarregar os testes e estou pronto para executar novamente, sem precisar fazer o load do arquivo novamente.E agora todos os testes passando:Testes executados com NUnitTests

Considerações

Bom pessoal, é isso. O NUnit é um framework bastante interessante e completo, maduro e robusto. Em alguns momentos acho a execução pelo runner dele mais rápida do que direto no Visual Studio. Vale a pena experimentar, principalmente pela quantidade de métodos que tornam os testes mais legíveis e simples. Testar deve ser simples e divertido =DEm um próximo post falarei sobre o framework Sharp Test Ex, indicado pelo Juan Lopes, que tem o intuito de tornar a escrita dos testes ainda mais legível e fluente.

Um teste é melhor do que nenhum teste.

Abraços,Vinicius Quaiato.

Voltar

Fork me on GitHub