單元測試的結構
更新:2007 年 11 月
單元測試是一種方法,此方法是以 C#、Visual Basic 或 Visual C++ 撰寫而成之類別的成員。
注意事項: |
---|
如需如何將單元測試與 C++ 實際執行程式碼一起使用,以及如何使用以 C++ 撰寫之單元測試的詳細資訊,請參閱單元測試和 C++。 |
若要讓 Team System 測試工具能夠辨識單元測試,這個原始程式碼檔案必須位於測試專案中,而測試專案則必須是 Visual Studio 方案的一部分。當您建置此專案或整個方案時,測試專案會建置到內含可執行單元測試的組件當中。
所有單元測試方法都會以 [TestMethod()] 屬性 (Attribute) 進行標記 (在 Visual Basic 中為 <TestMethod()>),而且所有方法都是 [TestClass()] 類別的成員。然後這個類別會在 Microsoft.VisualStudio.TestTools.UnitTesting 命名空間中定義。產生單元測試時,您會看到這個命名空間在所產生的檔案開頭被 using 或 Imports 陳述式所包含 (Include)。
單元測試屬性 (Attribute) 和屬性 (Property)
除了單元測試方法的 [TestMethod()] 屬性 (Attribute) 和其所含類別的 [TestClass()] 屬性之外,還有其他屬性可用來啟用特定的單元測試功能。其中最重要的是 [TestInitialize()] 和 [TestCleanup()] 屬性。使用以 [TestInitialize()] 標記的方法來準備要執行單元測試的環境;這麼做的目的,是建立已知的狀態,以便執行您的單元測試。例如,您可以使用 [TestInitialize()] 方法來複製、變更或建立測試會用到的某些資料檔。
使用以 [TestCleanup()] 標記的方法,可以在執行完測試之後,讓環境回到已知狀態;這個意思可能指刪除資料夾中的檔案,或是讓資料庫回到已知狀態。上述情況的範例之一,是在測試完訂單輸入應用程式中所用的方法之後,將庫存資料庫重設為初始狀態。此外,建議您在 [TestCleanup()] 或 ClassCleanup 方法中使用清除程式碼,而非在完成項方法中使用。從完成項方法所擲出的例外狀況不會被攔截,因此可能造成無法預期的結果。
測試類別的一個重要屬性 (Property) 是 TestContext 屬性。這個屬性含有許多資訊,包括目前正在執行之單元測試的名稱、部署目錄、記錄檔名稱,如果是資料導向測試的話,則還包含您所連接的資料庫。TestContext 屬性會傳回 TestContext 執行個體。如需詳細資訊,請參閱使用 TestContext 類別。
單元測試範例
下列程式碼片段會示範以 C# 所撰寫的簡單單元測試。
[TestMethod()]
public void DebitTest()
{
string customerName = "Mr. Bryan Walton";
double balance = 11.99;
BankAccount target = new BankAccount(customerName, balance);
double amount = 11.22;
target.Debit(amount);
Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05); // 0.05 is tolerance for floating-point comparison
//Assert.Inconclusive("A method that does not return a value cannot be verified.");
}
如需其他範例,請參閱為資料驅動的單元測試編碼。
單元測試的結果
有三種方式可以驗證單元測試是否通過:
使用一或數個 Assert 陳述式來驗證特定的結果。如需詳細資訊,請參閱使用 Assert 陳述式。
驗證是否未擲出例外狀況。此處也可以使用一或數個 Assert 陳述式。
驗證是否擲出特定的例外狀況。若要這麼做,可以使用 ExpectedExceptionAttribute 屬性。
使用 Assert 陳述式
如果和測試所完成的動作比較起來,測試所產生的「成功」或「失敗」結果所含的資訊更多或對您而言更重要,您就應該在測試的程式碼中使用一或數個 Assert 陳述式。
測試引擎會假設每個單元測試都始自成功 (Passing) 狀態。測試會一直維持該狀態,直到 Assert 陳述式產生與成功狀態衝突的結果,使得狀態從「成功」變成「失敗」或「結果不明」,或是擲出未在 ExpectedExceptionAttribute 屬性中指定的例外狀況為止。換句話說,每次執行沒有 Assert 陳述式的單元測試時,都會產生「成功」的結果。這不見得是一個無用的測試;您可能只想執行此程式碼,藉此確定它在執行時不會擲回例外狀況。無論測試是否產生決定性的結果,或甚至測試中是否含有 Assert 陳述式,在單元測試中執行的程式碼均會被涵蓋在程式碼涵蓋範圍統計資料報告中。
然而,若要驗證特定動作是否執行,或是有否達到特定狀態,就必須使用 Assert 陳述式。Microsoft.VisualStudio.TestTools.UnitTesting 命名空間中有許多可用的 Assert 陳述式。各種 Assert 陳述式可提供您極大的彈性。例如,使用 Assert.Fail() 陳述式可以強制測試失敗。除了這些 Assert 陳述式之外,當然您也可以建構自己的自訂功能,例如在 if 區塊中使用 Assert 陳述式。
無論測試傳回什麼樣的結果,它的成功或失敗都取決於其 Assert 陳述式。如果測試中含有多個 Assert 陳述式,測試會維持「成功」的狀態,直到遇到會將狀態變為「失敗」或「結果不明」的 Assert 陳述式為止。
如需詳細資訊,請參閱使用 Assert 類別。
請參閱
參考
Microsoft.VisualStudio.TestTools.UnitTesting