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.
Top comments (4)
Uso o MSTest e até agora atendeu todas as necessidades! Ele é simples e bem funcional
Boa!
Usei pouco o MSTest e hoje tenho uma preferência pelo xUnit.
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.