單元測試的結構

當您建立單元測試時,有許多檔案會加入至方案。 在本主題中,我們將使用單元測試的範例來探索最常見的檔案。 此範例來自逐步解說:建立和執行單元測試主題。

單元測試檔案的各部分

當您建立單元測試時,系統會針對您要測試的每個類別建立個別的單元測試檔案。 每個單元測試檔案會針對您要測試的每個方法包含一個測試方法。 在此範例中,要測試的這兩個方法屬於同一類別。 因此,只會有一個測試類別檔案:BankAccountTest.cs。

檔案的頂端區段

下圖將顯示前幾行程式碼,包括命名空間的參考、TestClassAttribute 和 TestContext 類別。 如果您需要程式碼範例,請參閱逐步解說。

範例單元測試檔案的頂端區段

  1. Microsoft.VisualStudio.TestTools.UnitTesting:當您建立單元測試時,Microsoft.VisualStudio.TestTools.UnitTesting 命名空間的參考就會加入至測試專案,而且此命名空間會包含在單元測試檔案頂端的 using 陳述式中。 此命名空間具有許多類別,可協助您處理單元測試,包括:

    • 您可以用來確認單元測試之條件的 Assert 類別

    • 可在單元測試回合前後執行程式碼以便確認特定開始和結束狀態的初始化和清除屬性

    • 可確認單元測試執行期間擲回特定例外狀況型別的 ExpectedException 屬性

    • 可儲存提供給單元測試之資訊的 TestContext 類別,例如資料驅動型測試的資料連接,以及針對 ASP.NET Web 服務執行單元測試所需的資訊

    如需詳細資訊,請參閱 Microsoft.VisualStudio.TestTools.UnitTesting

  2. TestClassAttribute:當您建立單元測試時,TestClassAttribute 就會包含在測試檔案中,表示這個特定類別可能包含以 [TestMethod()] 屬性標記的方法。 如果沒有 TestClassAttribute,就會忽略測試方法。

    某個測試類別可以從位於相同組件中的另一個測試類別繼承方法。 這表示,您可以在基底測試類別中建立測試方法,然後在衍生的測試類別中使用這些方法。

    如需詳細資訊,請參閱 TestClassAttribute

  3. TestContext:當您建立單元測試時,每個測試類別都會包含名為 testContextInstance 的變數。 TestContext 類別的屬性會儲存目前測試的相關資訊。 如需詳細資訊,請參閱 TestContext

檔案的底部區段

下圖將顯示在逐步解說中產生的程式碼後半部,包括 [其他測試屬性] 區段、TestMethod 屬性,以及方法的邏輯 (包含 Assert 陳述式)。

範例單元測試檔案的底部區段

  1. 其他測試屬性:展開這個區段可以顯示標記為註解的方法,而這些方法可用來透過下列屬性包含初始化和清除:

    1. [ClassInitialize()]:您可以使用 ClassInitialize,在執行類別中的第一項測試之前執行程式碼。

    2. [ClassCleanUp()]:您可以使用 ClassCleanup,在類別中的所有測試都已經執行之後執行程式碼。

    3. [TestInitialize()]:您可以使用 TestInitialize,在執行每項測試之前執行程式碼。

    4. [TestCleanUp()]:您可以使用 TestCleanUp,在每項測試都已經執行之後執行程式碼。

      您可以建立以 [ClassInitialize()] 或 [TestInitialize()] 屬性標記的方法來準備要執行單元測試的各環境層面。 這麼做的目的是要建立已知的狀態,以便執行您的單元測試。 例如,您可以使用 [ClassInitialize()] 或 [TestInitialize()] 方法來複製、變更或建立測試會用到的某些資料檔。

      您可以建立以 [ClassCleanup()] 或 [TestCleanUp{}] 屬性標記的方法,在測試執行完成之後,讓環境返回已知的狀態。 這可能表示要刪除資料夾中的檔案,或是讓資料庫返回已知的狀態。 上述情況的其中一種範例,是在測試完訂單輸入應用程式中所用的方法之後,將庫存資料庫重設為初始狀態。

      注意事項注意事項

      建議您在 [TestCleanup()] 或 [ClassCleanup()] 方法中使用清除程式碼,而非在完成項方法中使用。 從完成項方法所擲回的例外狀況不會被攔截,因此可能造成無法預期的結果。

  2. TestMethodAttribute:當您建立單元測試時,每個單元測試方法都會以 [TestMethod()] 屬性標記。 如果沒有這個屬性,單元測試就無法執行。 如需 TestMethod 屬性的詳細資訊,請參閱 TestMethodAttribute

  3. 測試方法的邏輯,包含 Assert 陳述式:每個所產生的單元測試都會具有空的變數以及預留位置 Assert 陳述式。 預設的預留位置 Assert 陳述式通常是 Assert.Inconclusive 陳述式。 若要讓測試有意義,您必須初始化變數並以適當的 Assert 陳述式取代預留位置。

    在此範例中,我們保留了 CreditTest 單元測試方法產生時的原狀,包括其 TODO 陳述式。 不過,我們初始化了這些變數並且取代了 DebitTest 測試方法中的 Assert 陳述式。 TODO 陳述式是當做您可能想要初始化這些程式碼行的提醒。

    注意事項注意事項

    測試方法的內容可能會因單元測試的類型以及所測試之方法的本質而有所不同。

關於命名慣例的注意事項:Visual Studio 測試工具會在產生單元測試時使用命名慣例。 例如,單元測試檔案的檔名是將 "Test" 這個字串連在您測試之程式碼所在的檔案名稱之後。在我們的範例中,它就是 "BankAccountTest.cs"。測試類別和測試方法的名稱也是使用預設值所產生。 您可以在 [建立單元測試] 對話方塊中按一下 [設定],藉以開啟 [測試產生設定] 對話方塊,然後在該對話方塊中變更這些預設值。

加入至方案的項目

本節涵蓋了在逐步解說:建立和執行單元測試中產生的檔案 (除了單元測試檔案以外)。

注意事項注意事項

當您產生單元測試時,系統預設建立的檔案主要取決於測試專案設定。 若要變更這些設定,請按一下 [工具],然後按一下 [選項]。 在 [選項] 對話方塊中,展開 [測試工具],然後按一下 [測試專案]。

下圖將顯示針對範例專案建立單元測試之後的 [方案總管]。

範例單元測試專案的 [方案總管]

  1. 方案項目:[方案項目] 包含兩個檔案:

    • Local.testsettings:這些設定會控制系統如何執行不收集診斷資料的本機測試。

    • Bank.vsmdi:這個檔案包含存在方案中之測試清單的相關資訊,而且它會填入 [測試清單編輯器] 視窗。

    • TraceAndTestImpact.testsettings:這些設定會控制系統如何執行收集特定診斷資料集的本機測試。

  2. 測試專案:包含單元測試所需的其餘檔案。

  3. 測試專案屬性:包含 AssemblyInfo.cs 檔案,可提供專案的建置選項。

  4. 測試專案參考:包含執行單元測試所需的參考。 當您根據現有的程式碼產生單元測試時,就會包含所需的參考。 不過,您可以加入參考來自訂測試。

  5. 單元測試檔案:這是本主題第一節所描述的單元測試檔案。 系統會針對您要測試的每一個類別,在測試專案中建立個別的單元測試檔案。 在此範例中,要測試的這兩個方法屬於同一類別。 因此,只會有一個測試類別檔案:BankAccountTest.cs。

請參閱

參考

Microsoft.VisualStudio.TestTools.UnitTesting

概念

針對現有的程式碼建立和執行單元測試

單元測試和 C++

泛型方法的單元測試

ASP.NET Web 服務的單元測試

Private、Internal 和 Friend 方法的單元測試