Os 3 principais frameworks de testes que todo desenvolvedor .NET deveria conhecer  
Tags: dotnet, nunit, mstest, xunit
Published: 2021-10-19 02:15:21

---
title: Os 3 principais frameworks de testes que todo desenvolvedor .NET deveria conhecer  
published: true
description: Um breve comparativo dos principais recursos do nUnit, MSTest e xUnit
tags: dotnet, nunit, mstest, xunit
series: Testes de Unidade no .NET
---

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.

<table>
<tr>
    <td>Versão Atual</td>
    <td>3.13.2</td>
</tr>
<tr>
    <td>Downloads</td>
    <td>140.2M</td>
</tr>
<tr>
    <td>Site</td>
    <td><a href="https://nunit.org/">https://nunit.org/</a></td>
</tr>
</table>

## 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)

<table>
<tr>
    <td>Versão Atual</td>
    <td>16.11.0</td>
</tr>
<tr>
    <td>Downloads</td>
    <td>252.3M</td>
</tr>
<tr>
    <td>Site</td>
    <td><a href="https://github.com/microsoft/testfx">https://github.com/microsoft/testfx</a></td>
</tr>
</table>

## 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.

<table>
<tr>
    <td>Versão Atual</td>
    <td>2.4.1</td>
</tr>
<tr>
    <td>Downloads</td>
    <td>166.4M</td>
</tr>
<tr>
    <td>Site</td>
    <td><a href="https://github.com/xunit/xunit">https://github.com/xunit/xunit</a></td>
</tr>
</table>

*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. <br> 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<br>Record.Exception | [ExpectedException] | Assert.Throws<br>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.<br>É válido lembrar que este método é   executado antes de cada teste.<br>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.<br>É válido lembrar que este método é   executado ao final de cada teste.<br>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<T> | 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.<br>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.<br>É 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<T> | 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.<br>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).<br> |

## 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"<br>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.<br>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<T> | IsInstanceOfType | IsType<T> | 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<T> | 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<T> | IsNotInstanceOfType | IsNotType<T> | 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.<br>Funciona para   qualquer tipo de objeto que implementa a interface   *IComparable*<br>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<T> | n/a | Throws<T> | 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.