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 automatici durante le fasi di sviluppo e 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.
Avviare Visual Studio Code.
Aprire la soluzione
ClassLibraryProjects
creata in Creare una libreria di classi .NET usando Visual Studio Code.Creare un progetto di unit test denominato "StringLibraryTest".
dotnet new mstest -o StringLibraryTest
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, contenente i tipi usati per il testing unità. Lo spazio dei nomi 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 il progetto di test alla soluzione.
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Aggiungere un riferimento al progetto
Affinché il progetto di test funzioni con la classe StringLibrary
, aggiungere un riferimento nel progetto StringLibraryTest
al progetto StringLibrary
.
Esegui questo comando:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
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 chiamano i membri della classe Assert. Molti metodi assert includono almeno due parametri, uno dei quali corrisponde al risultato previsto del test, mentre l'altro corrisponde al risultato effettivo. Nella tabella seguente sono illustrati alcuni metodi chiamati più frequentemente della classe Assert
:
Metodi Assert | Funzione |
---|---|
Assert.AreEqual |
Verifica che due oggetti o valori 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. Il metodo ha esito negativo se le variabili fanno riferimento a oggetti diversi. |
Assert.IsFalse |
Verifica che una condizione sia false . Il metodo ha esito negativo se la condizione è true . |
Assert.IsNotNull |
Verifica che un oggetto non sia null . Il metodo 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.
Durante il test del metodo StringLibrary.StartsWithUpper
, è possibile specificare alcune stringhe che iniziano con un carattere maiuscolo. In tal caso si prevede che il metodo restituisca true
, quindi è possibile chiamare il metodo Assert.IsTrue. Analogamente, è possibile specificare alcune stringhe che iniziano con un valore diverso da un carattere maiuscolo. In tal caso si prevede che il metodo restituisca false
, quindi è possibile chiamare il metodo Assert.IsFalse.
Poiché il metodo di libreria gestisce le stringhe, è anche necessario assicurarsi 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 in una variabile di string
assegnata a null
.
Verranno definiti tre metodi, ognuno dei quali chiama un metodo Assert per ogni elemento in una matrice di stringhe. Verrà chiamato un overload del metodo che consente di specificare un messaggio di errore da visualizzare in caso di errore 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).Salva le modifiche.
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale mostra che tutti i test sono stati superati.
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net8.0)
Gestire gli errori di test
Se si esegue lo sviluppo basato su test (TDD), si scrivono prima i test e non riescono la prima volta che vengono eseguiti. Aggiungere quindi il codice all'app che rende il test riuscito. Per questa esercitazione è stato creato il test dopo aver scritto il codice dell'app convalidato, in modo da non aver visto l'esito negativo 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
words
del metodoTestDoesNotStartWithUpper
per includere la stringa "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale indica che un test ha esito negativo e viene visualizzato un messaggio di errore per il test non riuscito: "Assert.IsFalse non riuscito. Expected for 'Error': false; actual: True". A causa dell'errore, non sono state testate stringhe nella matrice dopo il test di "Error".
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Rimuovere la stringa "Errore" aggiunta nel passaggio 1. Eseguire nuovamente il test. I test verranno superati.
Test della versione di rilascio della libreria
Ora che tutti i test sono stati superati durante l'esecuzione della compilazione Debug della libreria, eseguire i test un tempo aggiuntivo rispetto alla versione di rilascio della libreria. Esistono infatti alcuni fattori, ad esempio le ottimizzazioni del compilatore, in grado di generare a volte comportamenti diversi tra la versione di debug e quella di rilascio.
Eseguire i test con la configurazione della versione di rilascio:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
I test avranno esito positivo.
Esecuzione del 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. Anziché avviare il progetto dell'app ShowCase, aprire StringLibraryTest/UnitTest1.cs e selezionare Debug di tutti i test tra le righe 7 e 8. Se non si riesce a trovarlo, premere CTRL+MAIUSC+P per aprire il riquadro comandi e immettere Ricarica finestra.
Visual Studio Code avvia il progetto di test con il debugger collegato. L'esecuzione verrà arrestata in qualsiasi punto di interruzione aggiunto al progetto di test o al codice della libreria sottostante.
Risorse aggiuntive
Passaggi successivi
In questa esercitazione è stata testata una libreria di classi. È possibile rendere disponibile la libreria ad altri utenti pubblicandola in NuGet come pacchetto. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Se si pubblica una libreria come pacchetto NuGet, altri utenti possono installarla e usarla. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Non è necessario distribuire una libreria come pacchetto. Può essere incluso in un'app console che la usa. 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#:
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 automatici durante le fasi di sviluppo e 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.
Avviare Visual Studio Code.
Aprire la soluzione
ClassLibraryProjects
creata in Creare una libreria di classi .NET usando Visual Studio Code.Creare un progetto di unit test denominato "StringLibraryTest".
dotnet new mstest -o StringLibraryTest
Il modello di progetto crea un file UnitTest1.cs con il codice seguente:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
Il codice sorgente creato dal modello di unit test esegue le operazioni seguenti:
- Importa lo spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting, contenente i tipi usati per il testing unità.
- Applica l'attributo TestClassAttribute alla classe
UnitTest1
. - Applica l'attributo TestMethodAttribute per definire
TestMethod1
.
Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.
Aggiungere il progetto di test alla soluzione.
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Aggiungere un riferimento al progetto
Affinché il progetto di test funzioni con la classe StringLibrary
, aggiungere un riferimento nel progetto StringLibraryTest
al progetto StringLibrary
.
Esegui questo comando:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
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 chiamano i membri della classe Assert. Molti metodi assert includono almeno due parametri, uno dei quali corrisponde al risultato previsto del test, mentre l'altro corrisponde al risultato effettivo. Nella tabella seguente sono illustrati alcuni metodi chiamati più frequentemente della classe Assert
:
Metodi Assert | Funzione |
---|---|
Assert.AreEqual |
Verifica che due oggetti o valori 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. Il metodo ha esito negativo se le variabili fanno riferimento a oggetti diversi. |
Assert.IsFalse |
Verifica che una condizione sia false . Il metodo ha esito negativo se la condizione è true . |
Assert.IsNotNull |
Verifica che un oggetto non sia null . Il metodo 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.
Durante il test del metodo StringLibrary.StartsWithUpper
, è possibile specificare alcune stringhe che iniziano con un carattere maiuscolo. In tal caso si prevede che il metodo restituisca true
, quindi è possibile chiamare il metodo Assert.IsTrue. Analogamente, è possibile specificare alcune stringhe che iniziano con un valore diverso da un carattere maiuscolo. In tal caso si prevede che il metodo restituisca false
, quindi è possibile chiamare il metodo Assert.IsFalse.
Poiché il metodo di libreria gestisce le stringhe, è anche necessario assicurarsi 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 in una variabile di string
assegnata a null
.
Verranno definiti tre metodi, ognuno dei quali chiama un metodo Assert per ogni elemento in una matrice di stringhe. Verrà chiamato un overload del metodo che consente di specificare un messaggio di errore da visualizzare in caso di errore 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).Salva le modifiche.
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale mostra che tutti i test sono stati superati.
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net7.0)
Gestire gli errori di test
Se si esegue lo sviluppo basato su test (TDD), si scrivono prima i test e non riescono la prima volta che vengono eseguiti. Aggiungere quindi il codice all'app che rende il test riuscito. Per questa esercitazione è stato creato il test dopo aver scritto il codice dell'app convalidato, in modo da non aver visto l'esito negativo 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
words
del metodoTestDoesNotStartWithUpper
per includere la stringa "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale indica che un test ha esito negativo e viene visualizzato un messaggio di errore per il test non riuscito: "Assert.IsFalse non riuscito. Expected for 'Error': false; actual: True". A causa dell'errore, non sono state testate stringhe nella matrice dopo il test di "Error".
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Rimuovere la stringa "Errore" aggiunta nel passaggio 1. Eseguire nuovamente il test. I test verranno superati.
Test della versione di rilascio della libreria
Ora che tutti i test sono stati superati durante l'esecuzione della compilazione Debug della libreria, eseguire i test un tempo aggiuntivo rispetto alla versione di rilascio della libreria. Esistono infatti alcuni fattori, ad esempio le ottimizzazioni del compilatore, in grado di generare a volte comportamenti diversi tra la versione di debug e quella di rilascio.
Eseguire i test con la configurazione della versione di rilascio:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
I test avranno esito positivo.
Esecuzione del 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. Anziché avviare il progetto dell'app ShowCase, aprire StringLibraryTest/UnitTest1.cs e selezionare Debug di tutti i test tra le righe 7 e 8. Se non si riesce a trovarlo, premere CTRL+MAIUSC+P per aprire il riquadro comandi e immettere Ricarica finestra.
Visual Studio Code avvia il progetto di test con il debugger collegato. L'esecuzione verrà arrestata in qualsiasi punto di interruzione aggiunto al progetto di test o al codice della libreria sottostante.
Risorse aggiuntive
Passaggi successivi
In questa esercitazione è stata testata una libreria di classi. È possibile rendere disponibile la libreria ad altri utenti pubblicandola in NuGet come pacchetto. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Se si pubblica una libreria come pacchetto NuGet, altri utenti possono installarla e usarla. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Non è necessario distribuire una libreria come pacchetto. Può essere incluso in un'app console che la usa. Per informazioni su come pubblicare un'app console, vedere l'esercitazione precedente in questa serie:
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 automatici durante le fasi di sviluppo e 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.
Avviare Visual Studio Code.
Aprire la soluzione
ClassLibraryProjects
creata in Creare una libreria di classi .NET usando Visual Studio Code.Creare un progetto di unit test denominato "StringLibraryTest".
dotnet new mstest -f net6.0 -o StringLibraryTest
Il comando
-f net6.0
modifica il framework di destinazione predefinito in versionenet6.0
.Il comando
-o
o--output
specifica il percorso in cui inserire l'output generato.Il modello di progetto crea un file UnitTest1.cs con il codice seguente:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
Il codice sorgente creato dal modello di unit test esegue le operazioni seguenti:
- Importa lo spazio dei nomi Microsoft.VisualStudio.TestTools.UnitTesting, contenente i tipi usati per il testing unità.
- Applica l'attributo TestClassAttribute alla classe
UnitTest1
. - Applica l'attributo TestMethodAttribute per definire
TestMethod1
.
Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.
Aggiungere il progetto di test alla soluzione.
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
Aggiungere un riferimento al progetto
Affinché il progetto di test funzioni con la classe StringLibrary
, aggiungere un riferimento nel progetto StringLibraryTest
al progetto StringLibrary
.
Esegui questo comando:
dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
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 chiamano i membri della classe Assert. Molti metodi assert includono almeno due parametri, uno dei quali corrisponde al risultato previsto del test, mentre l'altro corrisponde al risultato effettivo. Nella tabella seguente sono illustrati alcuni metodi chiamati più frequentemente della classe Assert
:
Metodi Assert | Funzione |
---|---|
Assert.AreEqual |
Verifica che due oggetti o valori 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. Il metodo ha esito negativo se le variabili fanno riferimento a oggetti diversi. |
Assert.IsFalse |
Verifica che una condizione sia false . Il metodo ha esito negativo se la condizione è true . |
Assert.IsNotNull |
Verifica che un oggetto non sia null . Il metodo 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.
Durante il test del metodo StringLibrary.StartsWithUpper
, è possibile specificare alcune stringhe che iniziano con un carattere maiuscolo. In tal caso si prevede che il metodo restituisca true
, quindi è possibile chiamare il metodo Assert.IsTrue. Analogamente, è possibile specificare alcune stringhe che iniziano con un valore diverso da un carattere maiuscolo. In tal caso si prevede che il metodo restituisca false
, quindi è possibile chiamare il metodo Assert.IsFalse.
Poiché il metodo di libreria gestisce le stringhe, è anche necessario assicurarsi 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 in una variabile di string
assegnata a null
.
Verranno definiti tre metodi, ognuno dei quali chiama un metodo Assert per ogni elemento in una matrice di stringhe. Verrà chiamato un overload del metodo che consente di specificare un messaggio di errore da visualizzare in caso di errore 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).Salva le modifiche.
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale mostra che tutti i test sono stati superati.
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Passed! - Failed: 0, Passed: 3, Skipped: 0, Total: 3, Duration: 3 ms - StringLibraryTest.dll (net6.0)
Gestire gli errori di test
Se si esegue lo sviluppo basato su test (TDD), si scrivono prima i test e non riescono la prima volta che vengono eseguiti. Aggiungere quindi il codice all'app che rende il test riuscito. Per questa esercitazione è stato creato il test dopo aver scritto il codice dell'app convalidato, in modo da non aver visto l'esito negativo 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
words
del metodoTestDoesNotStartWithUpper
per includere la stringa "Error".string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
Eseguire i test:
dotnet test StringLibraryTest/StringLibraryTest.csproj
L'output del terminale indica che un test ha esito negativo e viene visualizzato un messaggio di errore per il test non riuscito: "Assert.IsFalse non riuscito. Expected for 'Error': false; actual: True". A causa dell'errore, non sono state testate stringhe nella matrice dopo il test di "Error".
Starting test execution, please wait... A total of 1 test files matched the specified pattern. Failed TestDoesNotStartWithUpper [28 ms] Error Message: Assert.IsFalse failed. Expected for 'Error': false; Actual: True Stack Trace: at StringLibraryTest.UnitTest1.TestDoesNotStartWithUpper() in C:\ClassLibraryProjects\StringLibraryTest\UnitTest1.cs:line 33 Failed! - Failed: 1, Passed: 2, Skipped: 0, Total: 3, Duration: 31 ms - StringLibraryTest.dll (net5.0)
Rimuovere la stringa "Errore" aggiunta nel passaggio 1. Eseguire nuovamente il test. I test verranno superati.
Test della versione di rilascio della libreria
Ora che tutti i test sono stati superati durante l'esecuzione della compilazione Debug della libreria, eseguire i test un tempo aggiuntivo rispetto alla versione di rilascio della libreria. Esistono infatti alcuni fattori, ad esempio le ottimizzazioni del compilatore, in grado di generare a volte comportamenti diversi tra la versione di debug e quella di rilascio.
Eseguire i test con la configurazione della versione di rilascio:
dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
I test avranno esito positivo.
Esecuzione del 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. Anziché avviare il progetto dell'app ShowCase, aprire StringLibraryTest/UnitTest1.cs e selezionare Debug di tutti i test tra le righe 7 e 8. Se non si riesce a trovarlo, premere CTRL+MAIUSC+P per aprire il riquadro comandi e immettere Ricarica finestra.
Visual Studio Code avvia il progetto di test con il debugger collegato. L'esecuzione verrà arrestata in qualsiasi punto di interruzione aggiunto al progetto di test o al codice della libreria sottostante.
Risorse aggiuntive
Passaggi successivi
In questa esercitazione è stata testata una libreria di classi. È possibile rendere disponibile la libreria ad altri utenti pubblicandola in NuGet come pacchetto. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Se si pubblica una libreria come pacchetto NuGet, altri utenti possono installarla e usarla. Per informazioni su come farlo, seguire un'esercitazione su NuGet:
Non è necessario distribuire una libreria come pacchetto. Può essere incluso in un'app console che la usa. Per informazioni su come pubblicare un'app console, vedere l'esercitazione precedente in questa serie: