Todo bom desenvolvedor sabe a importância de testar seu código, o uso de testes automatizados nos permite acelerar esse processo onde conseguimos testar centenas, talvez milhares de cenários de testes distintos em questão de segundos.
Quando o assunto é .NET temos três grandes players brigando pela preferência dos desenvolvedores.
nUnit
nUnit é um framework de teste de unidade que foi baseado no JUnit, sua versão 3 (mais atual), foi completamente reescrita com diversas novas funcionalidades de suporte para diversas linguagens da plataforma .NET.
Versão Atual | 3.13.2 |
Downloads | 140.2M |
Site | https://nunit.org/ |
MSTest
MSTest é o mais antigo da nossa lista, ele já foi o framework de teste padrão do Visual Studio (que atualmente conta com template de projeto de teste para todos os três frameworks da nossa lista)
Versão Atual | 16.11.0 |
Downloads | 252.3M |
Site | https://github.com/microsoft/testfx |
xUnit
O xUnit é o framework mais recente desta lista, foi desenvolvido pelo criador do nUnit v2 com o objetivo de simplificar e modernizar a forma como escrevemos testes.
Versão Atual | 2.4.1 |
Downloads | 166.4M |
Site | https://github.com/xunit/xunit |
Notem que apesar de mais novo o xUnit já supera o volume de downloads do nUnit
Principais Recursos
Abaixo uma relação com os principais recursos que os frameworks possuem:
[Test] | [TestMethod] | [Fact] | Define que o método representa um cenário de teste |
---|---|---|---|
[TestFixture] | [TestClass] | N/A | Marca uma determinada classe como sendo uma classe de testes. No xUnit essa identificação funciona a partir do método, todos os métodos marcados como testes através do atributo (Fact ou Theory) das classes publicas presentes no assembly são testados |
Assert.That Record.Exception |
[ExpectedException] | Assert.Throws Record.Exception |
Enquanto o MSTest define a Exceção esperada através do atributo ExpectedException o nUnit e o xUnit trabalham de forma semelhante permitindo que um o código seja processado e exceção seja retornada em uma váriável permitindo testar não apenas o tipo da exceção, mas também suas propriedades. |
[SetUp] | [TestInitialize] | Constructor | Método responsável por fazer o SetUp do cenário de teste. É válido lembrar que este método é executado antes de cada teste. Tanto o nUnit quanto o MSTest trabalham com atributos para identificar o método em questão, já o xUnit usa o construtor da classe para realizar este papel |
[TearDown] | [TestCleanup] | IDisposable.Dispose | Método responsável por fazer o TearDown do cenário de teste. É válido lembrar que este método é executado ao final de cada teste. Tanto o nUnit quanto o MSTest trabalham com atributos para identificar o método em questão, já o xUnit usa o Dispose da classe para realizar este papel, para que funcione é preciso implementar a interface IDisposable |
[OneTimeSetUp] | [ClassInitialize] | IClassFixture | Método responsável por fazer o SetUp da classe, ou seja este código é executado uma única vez para todos os testes contidos dento da classe em questão. Tanto o nUnit quanto o MSTest trabalham com atributos para identificar o método em questão, já o xUnit usa a interface IClassFixture, basta que a classe em questão implemente essa inteface (que não possui nenhum método) ela funciona apenas como marcação para que a Fixture implementada seja devidamente instanciada e passada para o construtor da classe. É valido lembrar que apenas uma instancia da Fixture será criada para aquela classe e TODOS os métodos presentes nela compartilharão a mesma instância. |
[OneTimeTearDown] | [ClassCleanup] | IClassFixture | Método responsável por fazer o TearDown da classe, ou seja este código é executado uma única vez para todos os testes contidos dento da classe em questão. Tanto o nUnit quanto o MSTest trabalham com atributos para identificar o método em questão, já o xUnit usa a interface IClassFixture, neste caso a Fixture em questão implemente o método Dispose da interface IDisposable. |
[Ignore("reason")] | [Ignore] | [Fact(Skip="reason")] | Utilizado para determinar que um determinado cenário de teste deve ser ignorado temporariamente |
[Property] | [TestProperty] | [Trait] | Atributo utilizado para atribuir metadados aos cenários de testes que podem auxiliar no processo de organização dos mesmos (possiveis relatórios com resultados da execução dos testes) |
[Theory] | [DataSource] | [Theory] | Utilizado para atribuir mais de uma entrada para um mesmo cenário de testes, por exemplo: Imaginem que precisamos testar um método responsável por validar uma formula matemática, porém nós queremos testar diversas entradas (inputs) com o uso desse recurso conseguimos realizar essa validação sem a necessidade de usar uma estrutura de loop (for / while). |
Assertions (Verificações)
Principais formas de verificar se um cenário de teste está de acordo com o esperado.
nUnit | MSTest | xUnit | Comentários |
---|---|---|---|
Is.EqualTo | AreEqual | Equal | Verifica se dois objetos são iguais (EqualTo) |
Is.Not.EqualTo | AreNotEqual | NotEqual | Verifica dois objetos são diferentes |
Is.Not.SameAs | AreNotSame | NotSame | Verifica dois objetos são instancias diferentes. |
Is.SameAs | AreSame | Same | Verifica se dois objetos são mesma instância. |
Does.Contain | Contains | Contains | Verifica se um objeto está contido em uma colecão, se aplica também para strings (sub-string). |
Does.Not.Contain | DoesNotContain | DoesNotContain | Verifica se um objeto NÃO está contido em uma colecão, se aplica também para strings (sub-string). |
Throws.Nothing | N/A | N/A | Presente apenas no nUnit é utilizado juntamente com o Assert.That para garantir que uma determinada exceção não foi levantada. |
N/A | Fail | N/A | Presente apenas no MSTest serve para fazer um teste falhar arbitrariamente utilizado em cenários em que a regra de validação é aplicada utilizando "IFs" Para o nUnit e xUnit a alternativa é trabalhar com Is.True(nUnit) e True(xUnit) |
Is.GreaterThan | N/A | N/A | Presente apenas no nUnit serve para validar se o resultado é maior que um determinado valor. Para o MSTest e xUnit a alternativa é trabalhar com IsTrue (MSTest) e True (xUnit) |
Is.InRange | N/A | InRange | Presente apenas no nUnit e no xUnit serve para validar se um objeto está dentro de um intervalo pré-definido, funciona para qualquer tipo que implementa a interface IComparable |
Is.AssignableFrom | N/A | IsAssignableFrom | Presente apenas no nUnit e no xUnit serve para validar se um objeto é de um tipo pré-definido (ou derivado) |
Is.Empty | N/A | Empty | Presente apenas no nUnit e no xUnit serve para validar se uma coleção está vazia. |
Is.False | IsFalse | False | Verifica se uma determinada operação retorna false. |
Is.InstanceOf | IsInstanceOfType | IsType | Diferentemente do AssignableFrom o InstanceOf verifica se um objeto é um determinado tipo, mas neste caso não considera derivados. |
Is.NaN | N/A | N/A | Presente apenas no nUnit é utilizado em conjunto com o Assert.That para determinar se um objeto é um número. |
Is.Not.AssignableFrom | N/A | N/A | Presente apenas no nUnit representa o cenário oposto do AssignableFrom verificando se um objeto não é de um determinado tipo ou derivado. |
Is.Not.Empty | N/A | NotEmpty | Presente apenas no nUnit e xUnit verifica se uma coleção possui pelo menos um elemento. |
Is.Not.InstanceOf | IsNotInstanceOfType | IsNotType | Representa o cenário oposto do InstanceOf verifica se um objeto não é de um tipo e não considera seus derivados. |
Is.Not.Null | IsNotNull | NotNull | Verifica se um objeto é diferente de null. |
Is.Null | IsNull | Null | Verifica se um objeto é null. |
Is.True | IsTrue | True | Verifica se uma operação retorna true. |
Is.LessThan | N/A | N/A | Presente apenas no nUnit serve para validar se um objeto é menor que um determinado valor. Funciona para qualquer tipo de objeto que implementa a interface IComparable Para o MSTest e xUnit a alternativa é trabalhar com IsTrue (MSTest) e True (xUnit) |
Is.Not.InRange | N/A | NotInRange | Presente apenas no nUnit e no xUnit serve para validar se um objeto está fora de um intervalo pré-definido, funciona para qualquer tipo de objeto que implementa a interface IComparable |
Throws.TypeOf | n/a | Throws | Verifica se uma determinada operação lança uma exceção pré-definida. |
Se você curtiu o post, deixe o seu coração e compartilhe com seus amigos.
Aproveite para me seguir aqui, no YouTube e no Instagram. Os links estão na BIO.
Em breve lançarei uma série de vídeos demonstrando uma mesma aplicação sendo testado pelos três frameworks. Fiquem ligados para não perder nenhum detalhe.
Usei pouco o MSTest e hoje tenho uma preferência pelo xUnit.