Partilhar via


Teste de unidade de bibliotecas do Visual Basic .NET Core usando o teste dotnet e MSTest

Este tutorial leva você através de uma experiência interativa criando uma solução de exemplo passo a passo para aprender conceitos de teste de unidade. Se preferir seguir o tutorial usando uma solução pré-construída, ver ou baixar o código de exemplo antes de começar. Para obter instruções de download, consulte Exemplos e Tutoriais.

Este artigo é sobre como testar um projeto .NET Core. Se você estiver testando um projeto ASP.NET Core, consulte Testes de integração no ASP.NET Core.

Criando o projeto de origem

Abra uma janela de shell. Crie um diretório chamado unit-testing-vb-mstest para armazenar a solução. Dentro desse novo diretório, execute dotnet new sln para criar uma nova solução. Essa prática facilita o gerenciamento da biblioteca de classes e do projeto de teste de unidade. Dentro do diretório da solução, crie um diretório PrimeService. Você tem o seguinte diretório e estrutura de arquivos até agora:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService

Faça PrimeService o diretório atual e execute dotnet new classlib -lang VB para criar o projeto de origem. Renomeie Class1.VB para PrimeService.VB. Você cria uma implementação com falha da classe PrimeService:

Namespace Prime.Services
    Public Class PrimeService
        Public Function IsPrime(candidate As Integer) As Boolean
            Throw New NotImplementedException("Please create a test first")
        End Function
    End Class
End Namespace

Altere o diretório para o diretório unit-testing-vb-using-mstest novamente. Execute dotnet sln add .\PrimeService\PrimeService.vbproj para adicionar o projeto de biblioteca de classes à solução.

Criando o projeto de teste

Em seguida, crie o diretório PrimeService.Tests. O esquema a seguir mostra a estrutura de diretórios:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests

Faça do diretório PrimeService.Tests o diretório atual e crie um novo projeto usando . Este comando cria um projeto de teste que usa MSTest como a biblioteca de teste. O modelo gerado configura o executor de testes no PrimeServiceTests.vbproj:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
  <PackageReference Include="MSTest.TestAdapter" Version="1.1.18" />
  <PackageReference Include="MSTest.TestFramework" Version="1.1.18" />
</ItemGroup>

O projeto de teste requer outros pacotes para criar e executar testes de unidade. dotnet new na etapa anterior adicionou MSTest e o runner MSTest. Agora, adicione a biblioteca de classes PrimeService como outra dependência ao projeto. Use o comando dotnet add reference:

dotnet add reference ../PrimeService/PrimeService.vbproj

Você pode ver o arquivo inteiro no repositório de amostras no GitHub.

Você tem o seguinte layout de solução final:

/unit-testing-vb-mstest
    unit-testing-vb-mstest.sln
    /PrimeService
        Source Files
        PrimeService.vbproj
    /PrimeService.Tests
        Test Source Files
        PrimeServiceTests.vbproj

Execute dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj no diretório unit-testing-vb-mstest.

Criando o primeiro teste

Você escreve um teste que falha, faz com que ele passe, e, em seguida, repete o processo. Remova UnitTest1.vb do diretório PrimeService.Tests e crie um novo arquivo do Visual Basic chamado PrimeService_IsPrimeShould.VB. Adicione o seguinte código:

Imports Microsoft.VisualStudio.TestTools.UnitTesting

Namespace PrimeService.Tests
    <TestClass>
    Public Class PrimeService_IsPrimeShould
        Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

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

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

    End Class
End Namespace

O atributo <TestClass> indica uma classe que contém testes. O atributo <TestMethod> indica um método que é executado pelo executor de teste. A partir do unit-testing-vb-mstest, execute dotnet test para criar os testes e a biblioteca de classes e, em seguida, execute os testes. O executor de teste MSTest contém o ponto de entrada do programa para executar seus testes. dotnet test inicia o executor de teste usando o projeto de teste de unidade que você criou.

O seu teste falha. Você ainda não criou a implementação. Faça este teste passar escrevendo o código mais simples na classe PrimeService que funciona:

Public Function IsPrime(candidate As Integer) As Boolean
    If candidate = 1 Then
        Return False
    End If
    Throw New NotImplementedException("Please create a test first.")
End Function

No diretório unit-testing-vb-mstest, execute dotnet test novamente. O comando dotnet test executa uma compilação para o projeto PrimeService e, em seguida, para o projeto PrimeService.Tests. Depois de construir ambos os projetos, ele executa esse teste único. Passa.

Adicionando mais recursos

Agora que você fez um teste aprovado, é hora de escrever mais. Existem alguns outros casos simples para números primos: 0, -1. Você pode adicionar esses casos como novos testes com o atributo <TestMethod>, mas isso rapidamente se torna tedioso. Existem outros atributos MSTest que permitem escrever um conjunto de testes semelhantes. Você pode usar o atributo <DataRow> junto com <TestMethod> atributo para especificar valores para essas entradas.

Em vez de criar novos testes, aplique esses dois atributos para criar uma única teoria. A teoria é um método que testa vários valores inferiores a dois, que é o menor número primo:

<TestClass>
Public Class PrimeService_IsPrimeShould
    Private _primeService As Prime.Services.PrimeService = New Prime.Services.PrimeService()

    <TestMethod>
    <DataRow(-1)>
    <DataRow(0)>
    <DataRow(1)>
    Sub IsPrime_ValuesLessThan2_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

    <TestMethod>
    <DataRow(2)>
    <DataRow(3)>
    <DataRow(5)>
    <DataRow(7)>
    Public Sub IsPrime_PrimesLessThan10_ReturnTrue(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

    <TestMethod>
    <DataRow(4)>
    <DataRow(6)>
    <DataRow(8)>
    <DataRow(9)>
    Public Sub IsPrime_NonPrimesLessThan10_ReturnFalse(value As Integer)
        Dim result As Boolean = _primeService.IsPrime(value)

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

Execute dotnet teste dois desses testes falharão. Para que todos os testes sejam aprovados, altere a cláusula if no início do método:

if candidate < 2

Continue a iterar adicionando mais testes, mais teorias e mais código na biblioteca principal. Você tem a versão concluída dos testes e a implementação completa da biblioteca.

Você criou uma pequena biblioteca e um conjunto de testes unitários para essa biblioteca. Você estruturou a solução para que a adição de novos pacotes e testes faça parte do fluxo de trabalho normal. Você concentrou a maior parte do seu tempo e esforço na resolução dos objetivos do aplicativo.