Share via


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

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.

  1. Avviare Visual Studio Code.

  2. Aprire la soluzione ClassLibraryProjects creata in Creare una libreria di classi .NET usando Visual Studio Code.

  3. 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:

    Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.

  4. 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.

  1. 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:

  1. 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 metodo TestDoesNotStartWithUpper include la lettera minuscola greca alfa (U+03B1) e la lettera minuscola cirillico Ghe (U+0433).

  2. Salva le modifiche.

  3. 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.

  1. Modificare la matrice words del metodo TestDoesNotStartWithUpper per includere la stringa "Error".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 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)
    
  3. 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.

  1. 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

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.

  1. Avviare Visual Studio Code.

  2. Aprire la soluzione ClassLibraryProjects creata in Creare una libreria di classi .NET usando Visual Studio Code.

  3. 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:

    Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.

  4. 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.

  1. 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:

  1. 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 metodo TestDoesNotStartWithUpper include la lettera minuscola greca alfa (U+03B1) e la lettera minuscola cirillico Ghe (U+0433).

  2. Salva le modifiche.

  3. 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.

  1. Modificare la matrice words del metodo TestDoesNotStartWithUpper per includere la stringa "Error".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 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)
    
  3. 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.

  1. 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

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.

  1. Avviare Visual Studio Code.

  2. Aprire la soluzione ClassLibraryProjects creata in Creare una libreria di classi .NET usando Visual Studio Code.

  3. 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 versione net6.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:

    Ogni metodo contrassegnato con [TestMethod] in una classe di test contrassegnata con [TestClass] viene eseguito automaticamente quando viene richiamato lo unit test.

  4. 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.

  1. 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:

  1. 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 metodo TestDoesNotStartWithUpper include la lettera minuscola greca alfa (U+03B1) e la lettera minuscola cirillico Ghe (U+0433).

  2. Salva le modifiche.

  3. 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.

  1. Modificare la matrice words del metodo TestDoesNotStartWithUpper per includere la stringa "Error".

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 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)
    
  3. 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.

  1. 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: