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 test
e 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.