Esercitazione: Testare una libreria di classi .NET con Visual Studio Code
Questa esercitazione illustra come automatizzare gli unit test aggiungendo un progetto di test a una soluzione.
Prerequisiti
- Questa esercitazione funziona con la soluzione creata in Creare una libreria di classi .NET usando Visual Studio Code.
Creare un progetto di unit test
Gli unit test forniscono test software automatizzati durante lo sviluppo e la pubblicazione. Il framework di test usato in questa esercitazione è MSTest. MSTest è uno dei tre framework di test tra cui è possibile scegliere. Gli altri sono xUnit e nUnit .
Avvia Visual Studio Code.
Aprire la soluzione
ClassLibraryProjects
creata in Creare una libreria di classi .NET usando Visual Studio Code.In Esplora soluzioni , selezionare Nuovo progettooppure nella Paletta comandi selezionare .NET: Nuovo progetto.
Selezionare Progetto di test MSTest, denominarlo "StringLibraryTest", selezionare la directory predefinita e selezionare Crea Progetto.
Il modello di progetto crea un file UnitTest1.cs con il codice seguente:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
Il codice sorgente creato dal modello di unit test esegue le operazioni seguenti:
- Applica l'attributo TestClassAttribute alla classe
UnitTest1
. - Applica l'attributo TestMethodAttribute per definire
TestMethod1
. - Importa lo spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting, che contiene i tipi usati per unit test. Il namespace viene importato tramite una direttiva
global using
in GlobalUsings.cs.
Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.
- Applica l'attributo TestClassAttribute alla classe
Aggiungere un riferimento al progetto
Affinché il progetto di test funzioni con la classe StringLibrary
, aggiungere un riferimento nel progetto di StringLibraryTest
al progetto StringLibrary
.
In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto "StringLibraryTest" e selezionare Aggiungi riferimento al progetto.
Selezionare "StringLibrary".
Aggiungere ed eseguire metodi di unit test
Quando Visual Studio richiama uno unit test, esegue ogni metodo contrassegnato con l'attributo TestMethodAttribute in una classe contrassegnata con l'attributo TestClassAttribute. Un metodo di test termina quando viene trovato il primo errore o quando tutti i test contenuti nel metodo hanno avuto esito positivo.
I test più comuni coinvolgono i membri della classe Assert. Molti metodi assert includono almeno due parametri, uno dei quali è il risultato previsto del test e l'altro dei quali è il risultato effettivo del test. Nella tabella seguente sono illustrati alcuni dei metodi chiamati più frequentemente della classe Assert
:
Metodi di assert | Funzione |
---|---|
Assert.AreEqual |
Verifica che due valori o oggetti siano uguali. L'asserzione ha esito negativo se i valori o gli oggetti non sono uguali. |
Assert.AreSame |
Verifica che due variabili oggetto facciano riferimento allo stesso oggetto. L'asserzione ha esito negativo se le variabili fanno riferimento a oggetti diversi. |
Assert.IsFalse |
Verifica che una condizione sia false . L'asserzione ha esito negativo se la condizione è true . |
Assert.IsNotNull |
Verifica che un oggetto non sia null . L'asserzione ha esito negativo se l'oggetto è null . |
È anche possibile usare il metodo Assert.ThrowsException in un metodo di test per indicare il tipo di eccezione che dovrebbe generare. Il test ha esito negativo se l'eccezione specificata non viene generata.
Nel test del metodo StringLibrary.StartsWithUpper
si desidera specificare una serie di stringhe che iniziano con un carattere maiuscolo. Si prevede che il metodo restituisca true
in questi casi, in modo da poter chiamare il metodo Assert.IsTrue. Analogamente, si vuole fornire una serie di stringhe che iniziano con un carattere diverso da un carattere maiuscolo. Si prevede che il metodo restituisca false
in questi casi, in modo da poter chiamare il metodo Assert.IsFalse.
Poiché il metodo di libreria gestisce le stringhe, vuoi anche assicurarti che gestisca correttamente una stringa vuota (String.Empty
) e una stringa null
. Una stringa vuota è una stringa senza caratteri e il cui Length è 0. Una stringa null
è una stringa che non è stata inizializzata. È possibile chiamare StartsWithUpper
direttamente come metodo statico e passare un singolo argomento String. In alternativa, è possibile chiamare StartsWithUpper
come metodo di estensione su una variabile string
assegnata a null
.
Verranno definiti tre metodi, ognuno dei quali chiama un metodo Assert per ogni elemento in una matrice di stringhe. Chiamerai un overload del metodo che ti consente di specificare un messaggio di errore da visualizzare in caso di fallimento del test. Il messaggio identifica la stringa che ha causato l'errore.
Per creare i metodi di test:
Aprire StringLibraryTest/UnitTest1.cs e sostituire tutto il codice con il codice seguente.
using Microsoft.VisualStudio.TestTools.UnitTesting; using UtilityLibraries; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestStartsWithUpper() { // Tests that we expect to return true. string[] words = { "Alphabet", "Zebra", "ABC", "Αθήνα", "Москва" }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsTrue(result, string.Format("Expected for '{0}': true; Actual: {1}", word, result)); } } [TestMethod] public void TestDoesNotStartWithUpper() { // Tests that we expect to return false. string[] words = { "alphabet", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " }; foreach (var word in words) { bool result = word.StartsWithUpper(); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word, result)); } } [TestMethod] public void DirectCallWithNullOrEmpty() { // Tests that we expect to return false. string?[] words = { string.Empty, null }; foreach (var word in words) { bool result = StringLibrary.StartsWithUpper(word); Assert.IsFalse(result, string.Format("Expected for '{0}': false; Actual: {1}", word == null ? "<null>" : word, result)); } } } }
Il test dei caratteri maiuscoli nel metodo
TestStartsWithUpper
include la lettera maiuscola greca alfa (U+0391) e la lettera maiuscola cirillico EM (U+041C). Il test dei caratteri minuscoli nel metodoTestDoesNotStartWithUpper
include la lettera minuscola greca alfa (U+03B1) e la lettera minuscola cirillico Ghe (U+0433).Salvare le modifiche.
Compilare ed eseguire i test
In Esplora soluzionifare clic con il pulsante destro del mouse sulla soluzione e selezionare Compila o nel riquadro comandi selezionare .NET: Compila.
Selezionare la finestra testing, selezionare Esegui Test o dalla palette comandi selezionare Test: Esegui tutti i Test.
Gestire gli errori di test
Se stai facendo sviluppo basato su test (TDD), scrivi prima i test e falliscono la prima volta che li esegui. Quindi, aggiungi il codice all'app che permette al test di riuscire. Per questa esercitazione, hai creato il test dopo aver scritto il codice dell'app che convalida, quindi non hai visto il fallimento del test. Per verificare che un test non riesca quando si prevede che non riesca, aggiungere un valore non valido all'input di test.
Modificare la matrice di
words
nel metodoTestDoesNotStartWithUpper
per includere la stringa "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Eseguire i test facendo clic sull'errore verde accanto al test nell'editor.
L'output mostra che il test è fallito e fornisce un messaggio di errore per il test fallito: "Assert.IsFalse non riuscito. Previsto per 'Errore': falso; effettivo: vero". A causa dell'errore, non sono state testate stringhe nell'array dopo "Error".
Rimuovi la stringa "Error" che hai aggiunto nel passaggio.
Ripeti il test; i test vengono superati.
Testare la versione release della libreria
Ora che tutti i test sono stati superati durante l'esecuzione della compilazione Debug della libreria, eseguire nuovamente i test sulla build Release della libreria. Alcuni fattori, incluse le ottimizzazioni del compilatore, possono talvolta produrre un comportamento diverso tra compilazioni di debug e rilascio.
Eseguire i test con la configurazione della build di rilascio:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
I test sono superati.
Eseguire il debug dei test
Se si usa Visual Studio Code come IDE, è possibile usare lo stesso processo illustrato in Eseguire il debug di un'applicazione console .NET usando Visual Studio Code per eseguire il debug del codice usando il progetto di unit test. Invece di avviare il progetto dell'app ShowCase, aprire StringLibraryTest/UnitTest1.cse selezionare Debug Tests nel file corrente tra le righe 7 e 8. Se non si riesce a trovarlo, premere Ctrl+Shift+P per aprire la palette comandi e immettere Ricarica finestra.
Visual Studio Code avvia il progetto di test con il debugger collegato. L'esecuzione verrà arrestata a qualsiasi punto di interruzione aggiunto al progetto di test o al codice della libreria utilizzata.
Risorse aggiuntive
Passaggi successivi
In questa esercitazione, hai eseguito test unitari su una libreria di classi. È possibile rendere disponibile la libreria ad altri utenti pubblicandola in NuGet come pacchetto. Per imparare come, seguire un tutorial su NuGet:
Se si pubblica una libreria come pacchetto NuGet, altri utenti possono installarla e usarla. Per sapere come fare, segui un tutorial su NuGet:
Non è necessario distribuire una libreria come pacchetto. Può essere incluso in un'applicazione console che lo utilizza. Per informazioni su come pubblicare un'app console, vedere l'esercitazione precedente in questa serie:
L'estensione C# Dev Kit di Visual Studio Code offre altri strumenti per lo sviluppo di app e librerie C#: