教學課程:使用 Visual Studio Code 對 .NET 類別庫執行測試
本教學課程示範如何新增測試專案至解決方案,以自動化單元測試。
必要條件
- 本教學課程適用於使用 Visual Studio Code 建立 .NET 類別庫 時所建立的解決方案。
建立單元測試專案
單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnit 與 nUnit。
啟動 Visual Studio Code。
開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的
ClassLibraryProjects
解決方案。建立名為「StringLibraryTest」的單元測試專案。
dotnet new mstest -o StringLibraryTest
此專案範本會使用下列程式碼建立 UnitTest1.cs 檔案:
namespace StringLibraryTest; [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } }
單元測試範本建立的原始程式碼會執行下列動作︰
- 它會將 TestClassAttribute 屬性套用至
UnitTest1
類別。 - 系統會套用 TestMethodAttribute 屬性以定義
TestMethod1
。 - 它會匯入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空間,其中包含用於單元測試的類型。 命名空間是透過 GlobalUsings.cs 中的
global using
指示詞彙入。
標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。
- 它會將 TestClassAttribute 屬性套用至
將測試專案新增至解決方案。
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
新增專案參考
若要讓測試專案使用 StringLibrary
類別,請將 StringLibraryTest
專案中的參考新增至 StringLibrary
專案。
執行以下命令:
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 引數。 也可以在指派給 null
的 string
變數上呼叫 StartsWithUpper
作為擴充方法。
您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。
建立測試方法:
開啟 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)。儲存您的變更。
執行測試:
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),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。
修改
TestDoesNotStartWithUpper
方法中的words
陣列,以包含字串「錯誤」。string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
執行測試:
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)
移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。
測試程式庫的發行版本
既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。
使用發行組建組態執行測試:
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# 應用程式和連結庫:
本教學課程示範如何新增測試專案至解決方案,以自動化單元測試。
必要條件
- 本教學課程適用於使用 Visual Studio Code 建立 .NET 類別庫 時所建立的解決方案。
建立單元測試專案
單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnit 與 nUnit。
啟動 Visual Studio Code。
開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的
ClassLibraryProjects
解決方案。建立名為「StringLibraryTest」的單元測試專案。
dotnet new mstest -o StringLibraryTest
此專案範本會使用下列程式碼建立 UnitTest1.cs 檔案:
using Microsoft.VisualStudio.TestTools.UnitTesting; namespace StringLibraryTest { [TestClass] public class UnitTest1 { [TestMethod] public void TestMethod1() { } } }
單元測試範本建立的原始程式碼會執行下列動作︰
- 它會匯入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空間,其中包含用於單元測試的類型。
- 它會將 TestClassAttribute 屬性套用至
UnitTest1
類別。 - 系統會套用 TestMethodAttribute 屬性以定義
TestMethod1
。
標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。
將測試專案新增至解決方案。
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
新增專案參考
若要讓測試專案使用 StringLibrary
類別,請將 StringLibraryTest
專案中的參考新增至 StringLibrary
專案。
執行以下命令:
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 引數。 也可以在指派給 null
的 string
變數上呼叫 StartsWithUpper
作為擴充方法。
您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。
建立測試方法:
開啟 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)。儲存您的變更。
執行測試:
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),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。
修改
TestDoesNotStartWithUpper
方法中的words
陣列,以包含字串「錯誤」。string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
執行測試:
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)
移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。
測試程式庫的發行版本
既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。
使用發行組建組態執行測試:
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 建立 .NET 類別庫 時所建立的解決方案。
建立單元測試專案
單元測試能在開發與發佈期間提供自動化的軟體測試。 您在本教學課程中所使用的測試架構為 MSTest。 MSTest 是三個可供選用的測試架構之一。 另外兩個架構分別是 xUnit 與 nUnit。
啟動 Visual Studio Code。
開啟您在 使用 Visual Studio Code .NET 類別庫時,建立的
ClassLibraryProjects
解決方案。建立名為「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() { } } }
單元測試範本建立的原始程式碼會執行下列動作︰
- 它會匯入 Microsoft.VisualStudio.TestTools.UnitTesting 命名空間,其中包含用於單元測試的類型。
- 它會將 TestClassAttribute 屬性套用至
UnitTest1
類別。 - 系統會套用 TestMethodAttribute 屬性以定義
TestMethod1
。
標記為 [TestClass] 的測試類別中具有 [TestMethod] 標記的每個方法叫用單元測試,叫用單元測試時都會自動執行。
將測試專案新增至解決方案。
dotnet sln add StringLibraryTest/StringLibraryTest.csproj
新增專案參考
若要讓測試專案使用 StringLibrary
類別,請將 StringLibraryTest
專案中的參考新增至 StringLibrary
專案。
執行以下命令:
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 引數。 也可以在指派給 null
的 string
變數上呼叫 StartsWithUpper
作為擴充方法。
您接下來要定義三個方法,每個方法會針對字串陣列中的各個元素呼叫 Assert 方法。 您會呼叫方法多載,以供您指定要在測試失敗後顯示的錯誤訊息。 此訊息會辨識造成失敗的字串。
建立測試方法:
開啟 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)。儲存您的變更。
執行測試:
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),請先轉寫測試,並在第一次執行測試時失敗。 接著,在應用程式中新增可以使測試成功的程式碼。 在本教學課程中,您先撰寫應用程式程式碼,才建立用於驗證的測試,因此測試尚未失敗過。 請輸入無效值到測試輸入,以驗證預期會失敗的測試是否失敗。
修改
TestDoesNotStartWithUpper
方法中的words
陣列,以包含字串「錯誤」。string[] words = { "alphabet", "Error", "zebra", "abc", "αυτοκινητοβιομηχανία", "государство", "1234", ".", ";", " " };
執行測試:
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)
移除您在步驟 1 中加入的字串「Error」後。 重新執行測試,並測試成功通過。
測試程式庫的發行版本
既然在執行程式庫的偵錯組建時,測試都已通過,請針對程式庫的發行組建執行一次額外測試。 許多因素 (包括編譯器最佳化) 有時會在偵錯和發行組建之間導致不同的行為。
使用發行組建組態執行測試:
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 教學課程的內容操作:
程式庫不需要以套件的形式散發。 其可以與使用套件的主控台應用程式配套。 若需了解如何發佈主控台應用程式,請參閱本系列先前的教學課程: