Teste de unidade de bibliotecas do Visual Basic .NET Core usando o teste dotnet 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é-criada, exiba ou baixe 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
dotnet new sln
comando 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
dotnet new classlib
comando 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
Crie o projeto PrimeService.Tests executando o seguinte comando:
dotnet new xunit -o PrimeService.Tests
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
<PackageReference />
elementos ao arquivo 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
PrimeService
classes como uma dependência ao 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 ren
comando para a versão do sistema operacional do ren
para renomear um arquivo:
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
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 em PrimeService.vb com o 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 IsPrime
método é chamável, mas não implementado. Uma chamada de teste falha IsPrime
. Com TDD, é escrito um teste que é conhecido por falhar. O código de destino é atualizado para que o teste seja aprovado. Você continua repetindo essa abordagem, escrevendo um teste com falha e, em seguida, atualizando o código de destino para ser aprovado.
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 [Fact]
atributo declara um método de teste que é executado pelo executor de teste. 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 teste usando o projeto de teste de unidade.
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 o dotnet test
. O teste é aprovado.
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 um conjunto de testes que executam o mesmo código, mas têm argumentos de entrada diferentes.[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 habilite [InlineData]
o teste de vários valores menores que dois. Dois é o menor número primo.
Executar dotnet test
, dois dos testes falham. Para fazer todos os testes passarem, atualize o IsPrime
método 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 concluído IsPrime
não é um algoritmo eficiente para testar a primalidade.