DEV Community

Víctor Fructuoso
Víctor Fructuoso

Posted on • Updated on

Os 3 principais frameworks de testes que todo desenvolvedor .NET deveria conhecer

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.

Discussion (4)

Collapse
zangassis profile image
Assis Zang

Uso o MSTest e até agora atendeu todas as necessidades! Ele é simples e bem funcional

Collapse
fructuoso profile image
Víctor Fructuoso Author

Boa!

Collapse
barbosarenan profile image
Renan Barbosa

Usei pouco o MSTest e hoje tenho uma preferência pelo xUnit.

Collapse
fructuoso profile image
Víctor Fructuoso Author

Eu usei um pouco de cada, tenho um carinho especial pelo xUnit, particularmente eu acho que ele entrega um isolamento melhor no processo de execução dos testes.