Condividi tramite


Test unitari delle librerie Visual Basic .NET Core utilizzando dotnet test e MSTest

Questa esercitazione illustra un'esperienza interattiva che crea una soluzione di esempio dettagliata per apprendere i concetti di unit test. Se preferisci seguire il tutorial usando una soluzione predefinita, visualizza o scarica il codice di esempio prima di iniziare. Per istruzioni sul download, vedere esempi ed esercitazioni .

Questo articolo descrive il test di un progetto .NET Core. Se si sta testando un progetto ASP.NET Core, vedere test di integrazione in ASP.NET Core.

Creazione del progetto di origine

Aprire una finestra della shell. Creare una directory denominata unit-testing-vb-mstest per contenere la soluzione. All'interno di questa nuova directory eseguire dotnet new sln per creare una nuova soluzione. Questa procedura semplifica la gestione sia della libreria di classi che del progetto di unit test. All'interno della directory della soluzione creare una directory PrimeService. Finora sono disponibili le directory e la struttura di file seguenti:

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

Imposta PrimeService come directory corrente ed esegui dotnet new classlib -lang VB per creare il progetto sorgente. Rinominare Class1.VB in PrimeService.VB. Si crea un'implementazione non riuscita della 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

Tornare alla directory unit-testing-vb-using-mstest directory. Eseguire dotnet sln add .\PrimeService\PrimeService.vbproj per aggiungere il progetto di libreria di classi alla soluzione.

Creazione del progetto di test

Creare quindi la directory PrimeService.Tests. La seguente illustrazione mostra la struttura della directory:

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

Impostare PrimeService.Tests directory corrente e creare un nuovo progetto usando dotnet new mstest -lang VB. Questo comando crea un progetto di test che usa MSTest come libreria di test. Il modello generato configura il test runner nel 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>

Il progetto di test richiede altri pacchetti per creare ed eseguire unit test. dotnet new ha aggiunto MSTest nel passaggio precedente. Aggiungere ora la libreria di classi PrimeService come altra dipendenza al progetto. Usare il comando dotnet add reference:

dotnet add reference ../PrimeService/PrimeService.vbproj

È possibile visualizzare l'intero file nel repository degli esempi su GitHub.

Il layout finale della soluzione è il seguente:

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

Eseguire dotnet sln add .\PrimeService.Tests\PrimeService.Tests.vbproj nella unit-testing-vb-mstest directory.

Creazione del primo test

Si scrive un test con esito negativo, si passa, quindi si ripete il processo. Rimuovere UnitTest1.vb dalla directory PrimeService.Tests e creare un nuovo file di Visual Basic denominato PrimeService_IsPrimeShould.VB. Aggiungere il codice seguente:

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

L'attributo <TestClass> indica una classe che contiene test. L'attributo <TestMethod> indica un metodo eseguito dal test runner. Dal unit-testing-vb-mstesteseguire dotnet test per compilare i test e la libreria di classi e quindi eseguire i test. Lo strumento esecutore di test MSTest contiene il punto di ingresso del programma per eseguire i test. dotnet test avvia lo strumento di esecuzione dei test usando il progetto di test unitario che hai creato.

Il tuo test fallisce. L'implementazione non è ancora stata creata. Eseguire questo test scrivendo il codice più semplice nella classe PrimeService che funziona:

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

Nella directory unit-testing-vb-mstest eseguire di nuovo dotnet test. Il comando dotnet test esegue una compilazione per il progetto PrimeService e quindi per il progetto PrimeService.Tests. Dopo la compilazione di entrambi i progetti, viene eseguito questo singolo test. Passa.

Aggiunta di altre funzionalità

Ora che hai superato un test, è il momento di scrivere altri test. Esistono alcuni altri semplici casi per i numeri primi: 0, -1. È possibile aggiungere questi casi come nuovi test con l'attributo <TestMethod>, ma questo diventa rapidamente noioso. Esistono altri attributi MSTest che consentono di scrivere un gruppo di test simili. È possibile usare l'attributo <DataRow> insieme all'attributo <TestMethod> per specificare i valori per tali input.

Anziché creare nuovi test, applicare questi due attributi per creare una singola teoria. La teoria è un metodo che verifica diversi valori minori di due, ovvero il numero primo più basso:

<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

Eseguire dotnet teste due di questi test hanno esito negativo. Per passare tutti i test, modificare la clausola if all'inizio del metodo :

if candidate < 2

Continuare a eseguire l'iterazione aggiungendo altri test, altre teorie e altro codice nella libreria principale. È stata completata la versione dei test e l'implementazione completa della libreria.

Hai creato una piccola libreria e un set di test unitari per tale libreria. La soluzione è stata strutturata in modo che l'aggiunta di nuovi pacchetti e test faccia parte del normale flusso di lavoro. La maggior parte del tempo e dello sforzo è stata concentrata sulla risoluzione degli obiettivi dell'applicazione.