{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
23/07/2010
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 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.
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:
E vamos adicionar a referência para o NUnit:
A DLL do NUnit estará em "Program Files\NUnit x.x\bin.net 2.0\framework\nunit.framework.dll".
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
Para executarmos os testes eu poderia simplesmente utilizar meu teste runner dentro do Visual Studio, como mostra a figura abaixo:
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:
Feito isso os nossos testes aparecerão no NUnitTests:
Clicando no botão Run nossos testes serão executados. Veja um exemplo com um teste falhando:
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:
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.
Abraços,Vinicius Quaiato.