Condividi tramite


Unit test delle librerie .NET Core di Visual Basic con test dotnet e xUnit

Questa esercitazione illustra come compilare una soluzione contenente un progetto di unit test e un progetto di libreria. Per seguire l'esercitazione usando una soluzione predefinita, visualizzare o scaricare il codice di esempio. Per istruzioni sul download, vedere esempi ed esercitazioni .

Creare la soluzione

In questa sezione viene creata una soluzione che contiene i progetti di origine e test. La soluzione completata ha la struttura di directory seguente:

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

Le istruzioni seguenti forniscono i passaggi per creare la soluzione di test. Per istruzioni su come creare la soluzione di test in un unico passaggio , vedere Comandi per creare una soluzione di test.

  • Aprire una finestra della shell.

  • Eseguire il comando seguente:

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

    Il comando dotnet new sln crea una nuova soluzione nella directory unit-testing-using-dotnet-test.

  • Cambia la directory nella cartella unit-testing-using-dotnet-test.

  • Eseguire il comando seguente:

    dotnet new classlib -o PrimeService -lang VB
    

    Il comando dotnet new classlib crea un nuovo progetto di libreria di classi nella cartella PrimeService. La nuova libreria di classi conterrà il codice da testare.

  • Rinominare Class1.vb in PrimeService.vb.

  • Sostituire il codice in PrimeService.vb con il codice seguente:

    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
    
  • Il codice precedente:

    • Genera un NotImplementedException con un messaggio che indica che non è implementato.
    • Viene aggiornato più tardi nel tutorial.
  • Nella directory unit-testing-using-dotnet-test eseguire il comando seguente per aggiungere il progetto di libreria di classi alla soluzione:

    dotnet sln add ./PrimeService/PrimeService.vbproj
    
  • Creare il progetto PrimeService.Tests eseguendo il comando seguente:

    dotnet new xunit -o PrimeService.Tests -lang VB
    
  • Il comando precedente:

    • Crea il progetto PrimeService.Tests nella directory PrimeService.Tests. Il progetto di test usa xUnit come libreria di test.
    • Configura il test runner aggiungendo gli elementi <PackageReference />seguenti al file di progetto:
      • "Microsoft.NET.Test.Sdk"
      • "xunit"
      • xunit.runner.visualstudio
  • Aggiungere il progetto di test al file della soluzione eseguendo il comando seguente:

    dotnet sln add ./PrimeService.Tests/PrimeService.Tests.vbproj
    
  • Aggiungere la libreria di classi PrimeService come dipendenza al progetto PrimeService.Tests:

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

Comandi per creare la soluzione

Questa sezione riepiloga tutti i comandi della sezione precedente. Ignorare questa sezione se sono stati completati i passaggi della sezione precedente.

I comandi seguenti creano la soluzione di test in un computer Windows. Per macOS e Unix, aggiornare il comando ren alla versione del sistema operativo di ren per rinominare un file:

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

Seguire le istruzioni per "Sostituire il codice in PrimeService.vb con il codice seguente" nella sezione precedente.

Creare un test

Un approccio comune nello sviluppo basato su test (TDD) consiste nello scrivere un test prima di implementare il codice di destinazione. Questa esercitazione usa l'approccio TDD. Il metodo IsPrime è chiamabile, ma non implementato. Una chiamata di test a IsPrime ha esito negativo. Con TDD, viene scritto un test noto per avere esito negativo. Il codice di destinazione viene aggiornato per effettuare il superamento del test. Continui a ripetere questo approccio, scrivendo un test non riuscito e poi aggiornando il codice di destinazione per farlo passare.

Aggiornare il progetto PrimeService.Tests:

  • Eliminare PrimeService.Tests/UnitTest1.vb.
  • Creare un file PrimeService.Tests/PrimeService_IsPrimeShould.vb .
  • Sostituire il codice in PrimeService_IsPrimeShould.vb con il codice seguente:
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

L'attributo [Fact] dichiara un metodo di test eseguito dal test runner. Dalla cartella PrimeService.Tests eseguire dotnet test. Il comando test dotnet compila entrambi i progetti ed esegue i test. Lo runner dei test xUnit contiene il punto di ingresso del programma per eseguire i test. dotnet test avvia il test runner usando il progetto di unit test.

Il test ha esito negativo perché IsPrime non è stato implementato. Usando l'approccio TDD, scrivere solo codice sufficiente in modo che questo test venga superato. Aggiornare IsPrime con il codice seguente:

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

Esegui dotnet test. Il test è superato.

Aggiungere altri test

Aggiungere test dei numeri primi per 0 e -1. È possibile copiare il test precedente e modificare il codice seguente per usare 0 e -1:

Dim result As Boolean = _primeService.IsPrime(1)

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

La copia del codice di test quando cambia solo un parametro comporta la duplicazione del codice e il bloat di test. Gli attributi xUnit seguenti consentono di scrivere una suite di test simili:

  • [Theory] rappresenta una suite di test che eseguono lo stesso codice ma hanno argomenti di input diversi.
  • [InlineData] attributo specifica i valori per tali input.

Anziché creare nuovi test, applicare gli attributi xUnit precedenti per creare una singola teoria. Sostituire il codice seguente:

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

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

con il seguente codice:

<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

Nel codice precedente [Theory] e [InlineData] abilitano il test di diversi valori che sono inferiori a due. Due è il numero primo più piccolo.

Esegui dotnet test, due dei test hanno esito negativo. Per superare tutti i test, aggiornare il metodo IsPrime con il codice seguente:

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

Seguendo l'approccio TDD, aggiungere altri test non superati, quindi aggiornare il codice di destinazione. Vedere la versione completata dei test e l'implementazione completa della libreria.

Il metodo IsPrime completato non è un algoritmo efficiente per il test della primalità.

Risorse aggiuntive