DEV Community

rodrigo-source
rodrigo-source

Posted on

2 2

Teste de unidade com xUnit

Pré-requisitos: VSCode e SDK do .NET

Primeiro criaremos a estrutura de pastas para organizar separadamente o projeto do tipo xUnit do projeto class library que suportará a classe "Calculadora" e o método "Somar" para exemplificar o uso do framework xUnit.net.

Iremos utilizar também o coverlet para quantificar a cobertura de código e o reportgenerator para exibir a página de relatório com o percentual de cobertura.

Para criar a estrutura de pasta execute o comando:

mkdir exemplo-teste-unidade-xunit
Enter fullscreen mode Exit fullscreen mode

Comando para mudar de diretório:

cd exemplo-teste-unidade-xunit
Enter fullscreen mode Exit fullscreen mode

Comando para criar um novo projeto do tipo "class library" com o nome "calculadora.lib":

dotnet new classlib -o calculadora.lib
Enter fullscreen mode Exit fullscreen mode

Comando para criar um novo projeto de testes com as referências inclusas da biblioteca do "xunit":

dotnet new xunit -o calculadora.tests
Enter fullscreen mode Exit fullscreen mode

Comando para adicionar ao projeto de testes a referência do projeto "calculadora.lib":

dotnet add ./calculadora.tests/calculadora.tests.csproj reference ./calculadora.lib/calculadora.lib.csproj
Enter fullscreen mode Exit fullscreen mode

Comando para abrir o Visual Code a partir da pasta "exemplo-teste-unidade-xunit":

code .
Enter fullscreen mode Exit fullscreen mode

No projeto "calculadora.lib" crie a classe "Calculadora" com o método "Somar" recebendo dois parâmetros do tipo inteiro para realizar a soma:

    public class Calculadora
    {
        public int Soma(int primeiroNumero, int segundoNumero)
        {
            return primeiroNumero + segundoNumero;
        }
    }
Enter fullscreen mode Exit fullscreen mode

Para criar o cenário de testes, expanda a pasta "calculadora.tests" e crie a classe "CalculadoraTestes" com os seguintes métodos com o atributo "Fact", "Theory" e "InlineData", que irei explicar em seguida.

Inclua a referência ao projeto "calculadora.lib":

using calculadora.lib;
Enter fullscreen mode Exit fullscreen mode
 public class CalculadoraTestes
    {
        [Fact]
        public void Soma_Calculadora_RetornarValorInteiroPositivoCorreto()
        {
            //Arrange
            Calculadora calculadora = new Calculadora();
            //Act
            int resultadoSoma = calculadora.Soma(5,2);
            //Assert
            Assert.Equal(7, resultadoSoma);
        }

        [Theory]
        [InlineData(1,9)]
        [InlineData(8,2)]
        [InlineData(5,5)]
        public void Soma_Calculadora_RetornarValor10InteiroPositivo(int primeiroValor, int segundoValor)
        {
            //Arrange
            Calculadora calculadora = new Calculadora();
            //Act
            int resultadoSoma = calculadora.Soma(primeiroValor, segundoValor);
            //Assert
            Assert.Equal(10, resultadoSoma);
        }
    }
Enter fullscreen mode Exit fullscreen mode

O primeiro método "Soma_Calculadora_RetornarValorInteiroPositivoCorreto" possui esta convenção de nomenclatura adotada para padronizar a escrita de nome de métodos de testes: nome do método + cenário de teste + resultado esperado.

O uso do atributo Fact significa que o método de teste não terá parâmetros.

Theory significa que o método terá parâmetros e para passar você deve utilizar também usar o atributo InlineData, como podemos ver no segundo método "Soma_Calculadora_RetornarValor10InteiroPositivo".

No framework xUnit.net existe também as palavras reservadas:

Skip que é a propriedade utilizada para desativar o teste. E o Trait que serve para organizar os testes em Grupos.

Para a escrita dos cenário de teste, utilizamos o princípio: Arrange, Act e Assert.

Arrange é criada a instância de classes ou moqs de interfaces para deixar claro tudo o que será utilizado no método a seguir.

Act é feita a ação do método desejado.

Assert é onde é validado se o retorno atendeu a expectativa esperada.

Antes de executar os testes, faça o build do projeto "calculadora.lib":

cd calculadora.lib
dotnet build
Enter fullscreen mode Exit fullscreen mode

Para executar os testes criados acima, volte para a pasta "exemplo-teste-unidade-xunit" e acesse a pasta do "calculadora.tests":

cd ..
cd calculadora.tests
Enter fullscreen mode Exit fullscreen mode

E execute o comando abaixo para rodar os cenários de testes:

dotnet test
Enter fullscreen mode Exit fullscreen mode

No output do terminal será exibido quantos testes passaram ou falharam:

A total of 1 test files matched the specified pattern.

Passed!  - Failed:     0, Passed:     4, Skipped:     0, Total:     4, Duration: 7 ms
Enter fullscreen mode Exit fullscreen mode

Cobertura de testes com coverlet

Acesse o diretório do projeto de teste:

cd calculadora.tests
Enter fullscreen mode Exit fullscreen mode

Execute o comando abaixo para adicionar ao projeto de testes o coverlet:

dotnet add package convert.collector
Enter fullscreen mode Exit fullscreen mode

Comando para instalar o pacote do reportgenerator:

dotnet tool install -g dotnet-reportgenerator-globaltool
Enter fullscreen mode Exit fullscreen mode

Comando para executar os cenários de testes com o parâmetro de cobertura de código:

dotnet test --verbosity minimal --collect:"XPlat Code Coverage"
Enter fullscreen mode Exit fullscreen mode

Acesse o diretório com o guid gerado na última execução:

cd TestResults/{guid}
Enter fullscreen mode Exit fullscreen mode

Execute o comando dentro da pasta guid acima:

reportgenerator "-reports:coverage.cobertura.xml" "-targetdir:coveragereport" -reporttypes:Html
Enter fullscreen mode Exit fullscreen mode

Acesse a pasta que foi criado TestResults/{guid}/coveragereport/index.html e abra no navegador o index.html para visualizar a cobertura de código do projeto:

Alt Text

Referências:
https://dotnet.microsoft.com/download
https://docs.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test
https://xunit.net/docs/getting-started/netcore/cmdline
https://github.com/coverlet-coverage/coverlet
https://github.com/danielpalme/ReportGenerator

Código fonte do projeto de exemplo: https://github.com/rodrigo-source/exemplo-teste-unidade-xunit

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

Eliminate Context Switching and Maximize Productivity

Pieces.app

Pieces Copilot is your personalized workflow assistant, working alongside your favorite apps. Ask questions about entire repositories, generate contextualized code, save and reuse useful snippets, and streamline your development process.

Learn more

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay