Partilhar via


Testes unitários de bibliotecas do Visual Basic .NET Core usando dotnet test e xUnit

Este tutorial mostra como criar uma solução contendo um projeto de teste de unidade e um projeto de biblioteca. Para seguir o tutorial usando uma solução pré-construída, visualizar ou baixar o código de exemplo. Para obter instruções de download, consulte Exemplos e Tutoriais.

Criar a solução

Nesta seção, é criada uma solução que contém os projetos de origem e de teste. A solução concluída tem a seguinte estrutura de diretórios:

/unit-testing-using-dotnet-test
    unit-testing-using-dotnet-test.sln
    /PrimeService
        PrimeService.vb
        PrimeService.vbproj
    /PrimeService.Tests
        PrimeService_IsPrimeShould.vb
        PrimeServiceTests.vbproj

As instruções a seguir fornecem as etapas para criar a solução de teste. Consulte Comandos para criar solução de teste para obter instruções sobre como criar a solução de teste em uma etapa.

  • Abra uma janela de shell.

  • Execute o seguinte comando:

    dotnet new sln -o unit-testing-using-dotnet-test
    

    O comando dotnet new sln cria uma nova solução no diretório unit-testing-using-dotnet-test.

  • Altere o diretório para a pasta unit-testing-using-dotnet-test.

  • Execute o seguinte comando:

    dotnet new classlib -o PrimeService -lang VB
    

    O comando dotnet new classlib cria um novo projeto de biblioteca de classes na pasta PrimeService. A nova biblioteca de classes conterá o código a ser testado.

  • Renomeie Class1.vb para PrimeService.vb.

  • Substitua o código no PrimeService.vb pelo seguinte código:

    Imports System
    
    Namespace Prime.Services
        Public Class PrimeService
            Public Function IsPrime(candidate As Integer) As Boolean
                Throw New NotImplementedException("Not implemented.")
            End Function
        End Class
    End Namespace
    
  • O código anterior:

    • Lança um NotImplementedException com uma mensagem indicando que não está implementado.
    • É atualizado posteriormente no tutorial.
  • No diretório unit-testing-using-dotnet-test, execute o seguinte comando para adicionar o projeto de biblioteca de classes à solução:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Criar o projeto PrimeService.Tests executando o seguinte comando:

    dotnet new xunit -o PrimeService.Tests -lang VB
    
  • O comando anterior:

    • Cria o projeto PrimeService.Tests no diretório PrimeService.Tests. O projeto de teste usa xUnit como a biblioteca de teste.
    • Configura o executor de teste adicionando os seguintes elementos <PackageReference /> ao ficheiro de projeto:
      • "Microsoft.NET.Test.Sdk"
      • Xunit
      • xunit.runner.visualstudio
  • Adicione o projeto de teste ao arquivo de solução executando o seguinte comando:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Adicione a biblioteca de classes PrimeService como dependência do projeto PrimeService.Tests.

    dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
    

Comandos para criar a solução

Esta seção resume todos os comandos na seção anterior. Ignore esta seção se tiver concluído as etapas na seção anterior.

Os comandos a seguir criam a solução de teste em uma máquina Windows. Para macOS e Unix, atualize o comando ren para a versão do sistema operativo de ren para renomear um ficheiro.

dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.vb PrimeService.vb
dotnet sln add ./PrimeService/PrimeService.vbproj
dotnet new xunit -o PrimeService.Tests -lang VB
dotnet add ./PrimeService.Tests/PrimeService.Tests.vbproj reference ./PrimeService/PrimeService.vbproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj

Siga as instruções para "Substituir o código no PrimeService.vb pelo código a seguir" na seção anterior.

Criar um teste

Uma abordagem popular no desenvolvimento orientado a testes (TDD) é escrever um teste antes de implementar o código de destino. Este tutorial usa a abordagem TDD. O método IsPrime é chamável, mas não implementado. Uma chamada de teste para IsPrime falha. Com TDD, escreve-se um teste que é conhecido por falhar. O código-alvo é atualizado para passar no teste. Você continua repetindo essa abordagem, escrevendo um teste que falha e, em seguida, atualizando o código de destino para que passe.

Atualize o projeto PrimeService.Tests:

  • Exclua PrimeService.Tests/UnitTest1.vb.
  • Crie um arquivo PrimeService.Tests/PrimeService_IsPrimeShould.vb .
  • Substitua o código no PrimeService_IsPrimeShould.vb pelo seguinte código:
Imports Xunit

Namespace PrimeService.Tests
    Public Class PrimeService_IsPrimeShould
        Private ReadOnly _primeService As Prime.Services.PrimeService

        Public Sub New()
            _primeService = New Prime.Services.PrimeService()
        End Sub


        <Fact>
        Sub IsPrime_InputIs1_ReturnFalse()
            Dim result As Boolean = _primeService.IsPrime(1)

            Assert.False(result, "1 should not be prime")
        End Sub

    End Class
End Namespace

O atributo [Fact] declara um método de teste que é executado pelo executante de testes. Na pasta PrimeService.Tests, execute dotnet test. O comando dotnet test cria ambos os projetos e executa os testes. O executor de teste xUnit contém o ponto de entrada do programa para executar os testes. dotnet test inicia o executor de testes usando o projeto de testes unitários.

O teste falha porque IsPrime não foi implementado. Usando a abordagem TDD, escreva apenas código suficiente para que esse teste seja aprovado. Atualize IsPrime com o seguinte código:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Not implemented.")
End Function

Execute dotnet test. O teste passa.

Adicionar mais testes

Adicione testes de número primo para 0 e -1. Você pode copiar o teste anterior e alterar o seguinte código para usar 0 e -1:

Dim result As Boolean = _primeService.IsPrime(1)

Assert.False(result, "1 should not be prime")

Copiar o código de teste quando apenas um parâmetro é alterado resulta em duplicação de código e inchaço de teste. Os seguintes atributos xUnit permitem escrever um conjunto de testes semelhantes:

  • [Theory] representa uma bateria de testes que executam o mesmo código, mas têm argumentos de entrada diferentes.
  • O atributo [InlineData] especifica valores para essas entradas.

Em vez de criar novos testes, aplique os atributos xUnit anteriores para criar uma única teoria. Substitua o seguinte código:

<Fact>
Sub IsPrime_InputIs1_ReturnFalse()
    Dim result As Boolean = _primeService.IsPrime(1)

    Assert.False(result, "1 should not be prime")
End Sub

com o seguinte código:

<Theory>
<InlineData(-1)>
<InlineData(0)>
<InlineData(1)>
Sub IsPrime_ValuesLessThan2_ReturnFalse(ByVal value As Integer)
    Dim result As Boolean = _primeService.IsPrime(value)

    Assert.False(result, $"{value} should not be prime")
End Sub

No código anterior, [Theory] e [InlineData] permitem testar vários valores menores que dois. Dois é o menor número primo.

Ao executar dotnet test, dois dos testes falham. Para que todos os testes sejam aprovados, atualize o método IsPrime com o seguinte código:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate < 2 Then
        Return False
    End If
    Throw New NotImplementedException("Not fully implemented.")
End Function

Seguindo a abordagem TDD, adicione mais testes com falha e, em seguida, atualize o código de destino. Veja a versão concluída dos testes e a implementação completa da biblioteca.

O método IsPrime concluído não é um algoritmo eficiente para verificar números primos.

Recursos adicionais