Testes de Unidade - Comparando NUnit , XUnit e Visual Studio


Hoje vamos comparar dois frameworks para realizar testes de unidade muito populares na plataforma .NET: NUnit e XUnit.

Os testes de unidade podem ser executados com a frequência que você quiser, em quantos tipos diferentes de dados você quiser e quase sem envolvimento humano depois que os testes forem escritos.

Além disso usar o código para testar o código muitas vezes resulta em você perceber falhas em seu programa que seriam muito difíceis de detectar do ponto de vista de um programador.

O teste de unidade é um tipo de teste feito no lado do desenvolvedor. É usado para testar métodos, propriedades, classes e montagens. O teste de unidade não é um teste feito pelo departamento de Garantia de Qualidade(QA). Para saber onde o teste de unidade se encaixa no desenvolvimento, observe a seguinte imagem:

Assim o teste de unidade é usado para testar um pequeno pedaço de código viável (operacional) chamado unidade. Isso incentiva os desenvolvedores a modificar o código sem preocupações imediatas sobre como essas mudanças podem afetar o funcionamento de outras unidades ou do programa como um todo. O teste de unidade pode ser demorado e tedioso, mas deve ser feito completamente com paciência.

Os frameworks de testes de unidades mais populares na plataforma .NET são : MSTest, NUnit e XUnit. 

  1. MSTest - É o mais simples entre os três, sua utilização é bem fácil, bastando adicionar o atributo [TestClass] e [TestMethod] respectivamente nas classes e métodos para iniciar a execução dos testes, outro ponto positivo é que o Visual Studio já vem com um UI Panel para exibir os seus testes. Sem dúvida um dos seus pontos fortes é a integração com o VS e a facilidade de uso;
     
  2. NUnit - É o mais popular, sendo muito usado desde 2006, assim tornou-se referência para testes de unidades, e sem dúvida é uma excelente solução para testes. A sua instalação no projeto é via NuGet package, bastando apenas procurar por NUnit no gerenciador de pacotes. Sua implementação é bastante similar ao MSTest, sendo que [TestClass] passa a ser [TestFixture] e [TestMethod] passa a ser apenas [Test] e testes parametrizados podem ser realizados apenas adicionando [TesteCase(“seu parametro”)];
     
  3. xUnit - Nasceu a partir do NUnit. Os antigos criadores do NUnit se uniram  com o objetivo de criar um framework de testes mais flexível e abrangente. Com isso encontramos muitas semelhanças entre ambos, apesar disso também existem diversas diferenças, como por exemplo, os nomes dos atributos; no XUnit não existe a necessidade de tornar uma classe testável como no MSTest[TestClass] e NUnit[TestFixture], neste basta decorar os métodos com os atributos [Facts] e [Theory], para testar métodos sem e com parâmetros respectivamente;

Além disso o VS 2019 Community também oferece templates de projetos para os 3 frameworks acima:

Além destes frameworks temos também as ferramentas de teste integradas ao próprio Visual Studio que podemos usar.

Todas estes frameworks oferecem um objetivo final semelhante, que é  ajudar a tornar a escrita de testes de unidade mais rápida, simples e fácil! Mas ainda existem algumas diferenças importantes entre eles. Alguns são mais focados em testes complexos e poderosos, enquanto outros classificam a simplicidade e a usabilidade como uma prioridade mais alta.

A ferramenta de testes do Visual Studio (MSTest)

Na maioria das versões desde 2005, o Visual Studio vem com um framework de teste integrado com suporte da Microsoft que é   oa mais simples dos três frameworks se usa uma estrutura de atributo de método fácil de entender onde você pode adicionar tags como '[TestClass]' e '[TestMethod]' ao seu código em ordem para fazer o teste.

O Visual Studio ainda possui um painel de IU dedicado à visualização de seus testes, que pode ser encontrado no menu Test -> Test Explorer.

Painel do Test Explorer:

O MS Test é extensível e funciona com .NET CLI e Visual Studio.

Exemplo:

[TestClass]
public class MyClass
{
     [TestInitialize()]
     public void Initialize() {}

     [TestCleanup()]
     public void Cleanup() {}

     [TestMethod]
     public void MyTest() {
     }
}

A ferramenta de testes NUnit

O NUnit talvez seja o framwork para testes de unidade mais usado sendo de código aberto, e, também uma solução de teste ampla e poderosa.

O NUnit é um framework de teste de unidade para todas as linguagens .NET. Inicialmente portado do JUnit, a versão de produção atual foi reescrita com muitos novos recursos e suporte para uma ampla gama de plataformas .NET. É um projeto da .NET Foundation.

O NUnit é instalado por meio de um pacote NuGet, que você pode pesquisar no Visual Studio. Os pacotes usados podem ser NUnit e NUnit.ConsoleRunner, embora você também tenha a opção de instalar um plug-in baseado em GUI para o Visual Studio.

O NUnit usa um sistema de estilo de atributo muito semelhante, assim como as ferramentas de teste do Visual Studio, mas agora iremos nos referir a [TestClass] como [TestFixture] e a [TestMethod] simplesmente como [Test].

Exemplo:

[TestCase(1)]
[TestCase(2)]

public void MeuTest(int testaValor) {
}

A ferramenta de testes xUnit

O xUnit é um framework de teste de unidade de código aberto com um foco maior em extensibilidade e flexibilidade; ele segue uma estrutura de desenvolvimento voltada para a comunidade e se concentra em ser fácil de expandir.

O xUnit é a tecnologia mais recente para aplicativos .NET de teste de unidade e funciona com ReSharper, CodeRush, TestDriven.NET e Xamarin. É um projeto da .NET Foundation e opera segundo seu código de conduta.

Na verdade, o xUnit se refere a um agrupamento de frameworks, mas nos concentraremos na versão C#. Outras versões incluem JUnit. O xUnit também usa um estilo de teste mais moderno e único, eliminando a terminologia padrão [test] [testfixture] e usando novas tags sofisticadas como Fact e Theories.

O NUnit e o xUnit são bastante semelhantes em muitos aspectos, já que o NUnit serve como base para muitos dos novos recursos que o XUnit apresenta.

Observe que o xUnit também é instalado por meio de um pacote NuGet muito parecido com o NUnit, que você pode pesquisar no Visual Studio. Os pacotes usados podem ser XUnit e XUnit.ConsoleRunner, embora você também tenha a opção de instalar um plug-in baseado em GUI para Visual Studio.

Muito parecida com a tag [TestCase] ​​em NUnit, o xUnit tem sua própria solução para fornecer parâmetros para um caso de teste. Para fazer isso, usamos a nova tag [InLineData] e as theories.

Em geral, um caso de teste que não tem parâmetros (portanto, não depende de nenhuma alteração de dados) é referido como um Fact em XUnit, o que significa que ele sempre executará o mesmo. Por outro lado, temos Theories, que se referem a um caso de teste que pode obter dados diretamente de tags [InLineData] ou mesmo de uma planilha Excel.

Exemplo:

public class Tests
{
    [Fact]
    public void MeuFact()
    {
       Assert.True(true);
    }

    [Theory]
    [InlineData(false)]
    [InlineData(true)]

    public void MeuTheory(bool testData)
    {
          Assert.True(boolean);
     }
}

Conclusão

Independentemente de qual dos frameworks de teste de unidade você usa, você receberá todos os fundamentos. Existem algumas diferenças entre eles que são detalhes.

Todos os três frameworks provavelmente farão 99% das coisas que você precisa testar no dia-a-dia. 3 ou 4 anos atrás, a falta de certos recursos no Ms Test tornou o NUnit uma consideração melhor. Hoje, essa lacuna diminuiu, então a escolha entre NUnit e MsTest ficou mais difícil.

Assim, quer seja pela conveniência do framework de teste de unidade integrado da Microsoft, o status sólido e comprovado do NUnit ou a abordagem moderna dos testes de unidade que o XUnit oferece, sempre vai existir algum detalhes que vai fazer você optar por um deles.

Se eu tivesse que escolher, escolheria o xUnit, por ser a mais recente (embora a documentação não seja lá estas coisas), e se isso não fosse possível por qualquer motivo, então eu escolheria o NUnit.

"Mas, se o nosso evangelho ainda está encoberto, é para os que se perdem que está encoberto, nos quais o deus deste século cegou o entendimento dos incrédulos, para que lhes não resplandeça a luz do evangelho da glória de Cristo, o qual é a imagem de Deus."
2 Coríntios 4:3,4

Referências:


José Carlos Macoratti