教學課程:使用 Visual Studio Code 對 .NET 類別庫執行測試

本教學課程示範如何新增測試專案至解決方案,以自動化單元測試。

必要條件

建立單元測試專案

單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnitnUnit

  1. 啟動 Visual Studio Code。

  2. 開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的 ClassLibraryProjects 解決方案。

  3. 建立名為「StringLibraryTest」的單元測試專案。

    dotnet new mstest -o StringLibraryTest
    

    此專案範本會使用下列程式碼建立 UnitTest1.cs 檔案:

    namespace StringLibraryTest;
    
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestMethod1()
        {
        }
    }
    

    單元測試範本建立的原始程式碼會執行下列動作︰

    標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。

  4. 將測試專案新增至解決方案。

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

新增專案參考

若要讓測試專案使用 StringLibrary 類別,請將 StringLibraryTest 專案中的參考新增至 StringLibrary 專案。

  1. 執行以下命令:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

新增及執行單元測試方法

Visual Studio 叫用單元測試時,會執行所有標記 TestMethodAttribute 屬性的類別中標記了 TestClassAttribute 屬性的方法。 測試方法會在發現第一次失敗,或方法中包含的所有測試均成功後結束。

最常見的測試會呼叫 Assert 類別的成員。 許多判斷提示方法都至少包括兩個參數,一個是預期的測試結果,另一個是實際的測試結果。 下表顯示 Assert 類別最常呼叫的方法之一:

Assert 方法 函式
Assert.AreEqual 驗證兩個值或物件相等。 如果值或物件不相等,判斷提示就會失敗。
Assert.AreSame 驗證兩個物件變數參考相同的物件。 如果變數參考不同的物件,判斷提示就會失敗。
Assert.IsFalse 驗證條件為 false。 如果條件為 true,判斷提示就會失敗。
Assert.IsNotNull 驗證物件並非 null。 如果物件為 null,判斷提示就會失敗。

您也可以在測試方法中使用 Assert.ThrowsException 方法,指出預期應擲回的例外狀況類型。 如果沒有值回指定的例外狀況,測試便會失敗。

在測試 StringLibrary.StartsWithUpper 方法時,您想提供幾個以大寫字元開頭的字串。 您預期此方法在這些情況下傳回 true,因此您可以呼叫 Assert.IsTrue 方法。 同樣地,您想提供幾個開頭不是大寫字元的字串。 您預期此方法在這些情況下傳回 false,因此您可以呼叫 Assert.IsFalse 方法。

因為程式庫方法會處理字串,建議您確定程式庫能成功處理 空字串 (String.Empty)null 字串。 空字串是指沒有字元且 Length 為 0 的字串。 null 字串是指尚未初始化的字串。 您可以直接呼叫 StartsWithUpper 作為靜態方法,並傳遞單一 String 引數。 也可以在指派給 nullstring 變數上呼叫 StartsWithUpper 作為擴充方法。

您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。

建立測試方法:

  1. 開啟 StringLibraryTest/UnitTest1.cs,然後以下列程式碼取代所有程式碼。

    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));
            }
        }
    }
    

    TestStartsWithUpper 方法中的大寫字元測試包括希臘文大寫字母 alpha (U+0391) 和斯拉夫文大寫字母 EM (U+041C)。 TestDoesNotStartWithUpper 方法中的小寫字元測試包括希臘文小寫字母 alpha (U+03B1) 和斯拉夫文小寫字母 Ghe (U+0433)。

  2. 儲存您的變更。

  3. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示所有測試皆已通過。

    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)
    

處理測試失敗

如果您正在執行測試驅動開發 (TDD),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。

  1. 修改 TestDoesNotStartWithUpper 方法中的 words 陣列,以包含字串「錯誤」。

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示一個測試失敗,並提供失敗測試的錯誤訊息:[Assert.IsFalse failed]。 預期為 'Error': false; 實際為: True」。 因為發生失敗,陣列中 [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. 移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。

測試程式庫的發行版本

既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。

  1. 使用發行組建組態執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    所有測試皆通過。

針對測試進行偵錯

若您採用 Visual Studio Code 作為整合式開發環境,可以遵照使用 Visual Studio 對 .NET 主控台應用程式偵錯中列出的流程,為單元測試專案使用的程式碼偵錯。 不要啟動 ShowCase 應用程式專案。開啟 StringLibraryTest/UnitTest1.cs,然後選取第 7 和第 8 行之間的 [偵錯所有測試] 。 如果找不到這個選項,請按下 [Ctrl] + [Shift] +[P] 鍵開啟命令選擇區,然後選擇 [重新載入視窗]

Visual Studio Code 會使用附加的偵錯工具啟動測試專案。 執行會在您新增至測試專案或基礎程式庫程式碼的中斷點停止。

其他資源

下一步

在本教學課程中,您已單元測試類別庫。 您可以將程式庫以套件形式發佈至 NuGet,提供給其他人使用。 如需了解執行方式,請遵循 NuGet 教學課程:

若將程式庫以 NuGet 套件的形式發佈,其他人即可安裝並使用。 如需了解執行方式,請遵循 NuGet 教學課程的內容操作:

程式庫不需要以套件的形式散發。 其可以與使用套件的主控台應用程式配套。 若需了解如何發佈主控台應用程式,請參閱本系列先前的教學課程:

Visual Studio Code 延伸模組 C# 開發工具包提供更多工具來開發 C# 應用程式和連結庫:

本教學課程示範如何新增測試專案至解決方案,以自動化單元測試。

必要條件

建立單元測試專案

單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnitnUnit

  1. 啟動 Visual Studio Code。

  2. 開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的 ClassLibraryProjects 解決方案。

  3. 建立名為「StringLibraryTest」的單元測試專案。

    dotnet new mstest -o StringLibraryTest
    

    此專案範本會使用下列程式碼建立 UnitTest1.cs 檔案:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    

    單元測試範本建立的原始程式碼會執行下列動作︰

    標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。

  4. 將測試專案新增至解決方案。

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

新增專案參考

若要讓測試專案使用 StringLibrary 類別,請將 StringLibraryTest 專案中的參考新增至 StringLibrary 專案。

  1. 執行以下命令:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

新增及執行單元測試方法

Visual Studio 叫用單元測試時,會執行所有標記 TestMethodAttribute 屬性的類別中標記了 TestClassAttribute 屬性的方法。 測試方法會在發現第一次失敗,或方法中包含的所有測試均成功後結束。

最常見的測試會呼叫 Assert 類別的成員。 許多判斷提示方法都至少包括兩個參數,一個是預期的測試結果,另一個是實際的測試結果。 下表顯示 Assert 類別最常呼叫的方法之一:

Assert 方法 函式
Assert.AreEqual 驗證兩個值或物件相等。 如果值或物件不相等,判斷提示就會失敗。
Assert.AreSame 驗證兩個物件變數參考相同的物件。 如果變數參考不同的物件,判斷提示就會失敗。
Assert.IsFalse 驗證條件為 false。 如果條件為 true,判斷提示就會失敗。
Assert.IsNotNull 驗證物件並非 null。 如果物件為 null,判斷提示就會失敗。

您也可以在測試方法中使用 Assert.ThrowsException 方法,指出預期應擲回的例外狀況類型。 如果沒有值回指定的例外狀況,測試便會失敗。

在測試 StringLibrary.StartsWithUpper 方法時,您想提供幾個以大寫字元開頭的字串。 您預期此方法在這些情況下傳回 true,因此您可以呼叫 Assert.IsTrue 方法。 同樣地,您想提供幾個開頭不是大寫字元的字串。 您預期此方法在這些情況下傳回 false,因此您可以呼叫 Assert.IsFalse 方法。

因為程式庫方法會處理字串,建議您確定程式庫能成功處理 空字串 (String.Empty)null 字串。 空字串是指沒有字元且 Length 為 0 的字串。 null 字串是指尚未初始化的字串。 您可以直接呼叫 StartsWithUpper 作為靜態方法,並傳遞單一 String 引數。 也可以在指派給 nullstring 變數上呼叫 StartsWithUpper 作為擴充方法。

您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。

建立測試方法:

  1. 開啟 StringLibraryTest/UnitTest1.cs,然後以下列程式碼取代所有程式碼。

    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));
            }
        }
    }
    

    TestStartsWithUpper 方法中的大寫字元測試包括希臘文大寫字母 alpha (U+0391) 和斯拉夫文大寫字母 EM (U+041C)。 TestDoesNotStartWithUpper 方法中的小寫字元測試包括希臘文小寫字母 alpha (U+03B1) 和斯拉夫文小寫字母 Ghe (U+0433)。

  2. 儲存您的變更。

  3. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示所有測試皆已通過。

    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)
    

處理測試失敗

如果您正在執行測試驅動開發 (TDD),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。

  1. 修改 TestDoesNotStartWithUpper 方法中的 words 陣列,以包含字串「錯誤」。

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示一個測試失敗,並提供失敗測試的錯誤訊息:[Assert.IsFalse failed]。 預期為 'Error': false; 實際為: True」。 因為發生失敗,陣列中 [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. 移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。

測試程式庫的發行版本

既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。

  1. 使用發行組建組態執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    所有測試皆通過。

針對測試進行偵錯

若您採用 Visual Studio Code 作為整合式開發環境,可以遵照使用 Visual Studio 對 .NET 主控台應用程式偵錯中列出的流程,為單元測試專案使用的程式碼偵錯。 不要啟動 ShowCase 應用程式專案。開啟 StringLibraryTest/UnitTest1.cs,然後選取第 7 和第 8 行之間的 [偵錯所有測試] 。 如果找不到這個選項,請按下 [Ctrl] + [Shift] +[P] 鍵開啟命令選擇區,然後選擇 [重新載入視窗]

Visual Studio Code 會使用附加的偵錯工具啟動測試專案。 執行會在您新增至測試專案或基礎程式庫程式碼的中斷點停止。

其他資源

下一步

在本教學課程中,您已單元測試類別庫。 您可以將程式庫以套件形式發佈至 NuGet,提供給其他人使用。 如需了解執行方式,請遵循 NuGet 教學課程:

若將程式庫以 NuGet 套件的形式發佈,其他人即可安裝並使用。 如需了解執行方式,請遵循 NuGet 教學課程的內容操作:

程式庫不需要以套件的形式散發。 其可以與使用套件的主控台應用程式配套。 若需了解如何發佈主控台應用程式,請參閱本系列先前的教學課程:

本教學課程示範如何新增測試專案至解決方案,以自動化單元測試。

必要條件

建立單元測試專案

單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnitnUnit

  1. 啟動 Visual Studio Code。

  2. 開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的 ClassLibraryProjects 解決方案。

  3. 建立名為「StringLibraryTest」的單元測試專案。

    dotnet new mstest -f net6.0 -o StringLibraryTest
    

    命令 -f net6.0 會將預設目標框架變更為 net6.0 版本。

    -o--output 命令會指定要將產生的輸出放入的位置。

    此專案範本會使用下列程式碼建立 UnitTest1.cs 檔案:

    using Microsoft.VisualStudio.TestTools.UnitTesting;
    
    namespace StringLibraryTest
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void TestMethod1()
            {
            }
        }
    }
    

    單元測試範本建立的原始程式碼會執行下列動作︰

    標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。

  4. 將測試專案新增至解決方案。

    dotnet sln add StringLibraryTest/StringLibraryTest.csproj
    

新增專案參考

若要讓測試專案使用 StringLibrary 類別,請將 StringLibraryTest 專案中的參考新增至 StringLibrary 專案。

  1. 執行以下命令:

    dotnet add StringLibraryTest/StringLibraryTest.csproj reference StringLibrary/StringLibrary.csproj
    

新增及執行單元測試方法

Visual Studio 叫用單元測試時,會執行所有標記 TestMethodAttribute 屬性的類別中標記了 TestClassAttribute 屬性的方法。 測試方法會在發現第一次失敗,或方法中包含的所有測試均成功後結束。

最常見的測試會呼叫 Assert 類別的成員。 許多判斷提示方法都至少包括兩個參數,一個是預期的測試結果,另一個是實際的測試結果。 下表顯示 Assert 類別最常呼叫的方法之一:

Assert 方法 函式
Assert.AreEqual 驗證兩個值或物件相等。 如果值或物件不相等,判斷提示就會失敗。
Assert.AreSame 驗證兩個物件變數參考相同的物件。 如果變數參考不同的物件,判斷提示就會失敗。
Assert.IsFalse 驗證條件為 false。 如果條件為 true,判斷提示就會失敗。
Assert.IsNotNull 驗證物件並非 null。 如果物件為 null,判斷提示就會失敗。

您也可以在測試方法中使用 Assert.ThrowsException 方法,指出預期應擲回的例外狀況類型。 如果沒有值回指定的例外狀況,測試便會失敗。

在測試 StringLibrary.StartsWithUpper 方法時,您想提供幾個以大寫字元開頭的字串。 您預期此方法在這些情況下傳回 true,因此您可以呼叫 Assert.IsTrue 方法。 同樣地,您想提供幾個開頭不是大寫字元的字串。 您預期此方法在這些情況下傳回 false,因此您可以呼叫 Assert.IsFalse 方法。

因為程式庫方法會處理字串,建議您確定程式庫能成功處理 空字串 (String.Empty)null 字串。 空字串是指沒有字元且 Length 為 0 的字串。 null 字串是指尚未初始化的字串。 您可以直接呼叫 StartsWithUpper 作為靜態方法,並傳遞單一 String 引數。 也可以在指派給 nullstring 變數上呼叫 StartsWithUpper 作為擴充方法。

您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。

建立測試方法:

  1. 開啟 StringLibraryTest/UnitTest1.cs,然後以下列程式碼取代所有程式碼。

    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));
            }
        }
    }
    

    TestStartsWithUpper 方法中的大寫字元測試包括希臘文大寫字母 alpha (U+0391) 和斯拉夫文大寫字母 EM (U+041C)。 TestDoesNotStartWithUpper 方法中的小寫字元測試包括希臘文小寫字母 alpha (U+03B1) 和斯拉夫文小寫字母 Ghe (U+0433)。

  2. 儲存您的變更。

  3. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示所有測試皆已通過。

    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)
    

處理測試失敗

如果您正在執行測試驅動開發 (TDD),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。

  1. 修改 TestDoesNotStartWithUpper 方法中的 words 陣列,以包含字串「錯誤」。

    string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство",
                       "1234", ".", ";", " " };
    
  2. 執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj
    

    終端輸出會顯示一個測試失敗,並提供失敗測試的錯誤訊息:[Assert.IsFalse failed]。 預期為 'Error': false; 實際為: True」。 因為發生失敗,陣列中 [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. 移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。

測試程式庫的發行版本

既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。

  1. 使用發行組建組態執行測試:

    dotnet test StringLibraryTest/StringLibraryTest.csproj --configuration Release
    

    所有測試皆通過。

針對測試進行偵錯

若您採用 Visual Studio Code 作為整合式開發環境,可以遵照使用 Visual Studio 對 .NET 主控台應用程式偵錯中列出的流程,為單元測試專案使用的程式碼偵錯。 不要啟動 ShowCase 應用程式專案。開啟 StringLibraryTest/UnitTest1.cs,然後選取第 7 和第 8 行之間的 [偵錯所有測試] 。 如果找不到這個選項,請按下 [Ctrl] + [Shift] +[P] 鍵開啟命令選擇區,然後選擇 [重新載入視窗]

Visual Studio Code 會使用附加的偵錯工具啟動測試專案。 執行會在您新增至測試專案或基礎程式庫程式碼的中斷點停止。

其他資源

下一步

在本教學課程中,您已單元測試類別庫。 您可以將程式庫以套件形式發佈至 NuGet,提供給其他人使用。 如需了解執行方式,請遵循 NuGet 教學課程:

若將程式庫以 NuGet 套件的形式發佈,其他人即可安裝並使用。 如需了解執行方式,請遵循 NuGet 教學課程的內容操作:

程式庫不需要以套件的形式散發。 其可以與使用套件的主控台應用程式配套。 若需了解如何發佈主控台應用程式,請參閱本系列先前的教學課程: