分享方式:


使用 IntelliTest 產生模糊測試的單元測試

IntelliTest 會探索您的 .NET 程式碼,從而產生測試資料及單元測試套件。 其會為程式碼中的每一個陳述式產生一個用以執行該陳述式的測試輸入。 程式碼的每個條件分支都會執行大小寫分析。 例如,可能擲回例外狀況的 if 陳述式、判斷提示及所有作業都會加以分析。 這項分析會用於為每個方法的參數型單元測試產生測試資料,從而建立具有高程式碼涵蓋範圍的單元測試。 將其視為智慧模糊測試,將輸入和測試案例修剪為執行所有邏輯分支並檢查例外狀況的項目。

當您執行 IntelliTest 時,您很容易就能看到哪些測試失敗,進而加入必要的程式碼來修正測試。 您可以選取產生的測試,將其儲存到測試專案中做為迴歸套件。 當您變更程式碼時,請重新執行 IntelliTest,如此所產生的測試才能與您的程式碼變更保持同步。

可用性和延伸模組

建立 IntelliTest執行 IntelliTest 功能表命令︰

  • 僅在 Visual Studio Enterprise Edition 中提供使用。

  • 只支援以 .NET Framework 為目標的 C# 程式碼。

    注意

    如需 IntelliTest 的 .NET 6 支援,您可以安裝 Visual Studio Enterprise 的預覽版本,並查看公告

  • 可延伸並支援以 MSTest、MSTest V2、NUnit 及 xUnit 格式發出測試。

  • 不支援 x64 設定。

探索:使用 IntelliTest 探索您的程式碼並產生單元測試

若要產生單元測試,您的類型必須是公用的。

  1. 在 Visual Studio 中開啟您的解決方案,然後開啟擁有您欲測試方法的類別檔案。

  2. 在方法上按一下滑鼠右鍵,然後選擇 [執行 IntelliTest] ,為方法中的程式碼產生單元測試。

    Screenshot of right click on method to generate unit tests.

    Screenshot of right click on method to generate unit tests.

    IntelliTest 會以不同的輸入多次執行您的程式碼。 每次執行都會顯示在資料表中,並指出其測試資料及最終結果或例外狀況。

    Screenshot of Exploration Results window.

    Screenshot of Exploration Results window.

若要為類別中的所有公用方法產生單元測試,只要在該類別上 (不需要在特定的方法上) 按一下滑鼠右鍵,然後選擇 [執行 IntelliTest] 即可。 您可以利用 [瀏覽結果] 視窗中的下拉式清單,顯示類別中每個方法的單元測試及輸入資料。

Screenshot of test results to view from list.

Screenshot of test results to view from list.

對於成功的測試,請查看結果資料欄中的報告結果,是否符合您對程式碼的要求。 請針對失敗的測試,適當修正程式碼。 然後重新執行 IntelliTest 來驗證修正。

持續:將單元測試儲存為迴歸套件

  1. 選取要與參數型單元測試一併儲存到測試專案中的資料列。

    Screenshot of Save test results.

    Screenshot of Save test results.

    您可以檢視測試專案和已建立的參數化單元測試,其中每個資料列對應的個別單元測試會儲存在測試專案的 .g.cs 檔案中,而參數化的單元測試會儲存在其對應的 .cs 檔案中。 您可以從 [測試總管] 執行這些測試及檢視其結果,與您手動建立單元測試時所執行的各項作業無異。

    Screenshot of saved tests in Solution Explorer.

    Screenshot of saved tests in Solution Explorer.

    所有必要的參考也會一併加入測試專案中。

    當方法程式碼有所變更時,請重新執行 IntelliTest,如此單元測試才會與變更保持同步。

協助:使用 IntelliTest 專注於程式碼的探索

  1. 如果您有更複雜的程式碼,IntelliTest 可協助您專注探索程式碼。 例如,若您的方法在參數中設定了介面,而實作該介面的類別又不只一個,IntelliTest 會探索這些類別並回報警告。

    您可以檢視這些警告,決定您的因應對策。

    Screenshot of View warnings.

    Screenshot of View warnings.

  2. 當您檢查完程式碼,並確認您的測試標的之後,您可以修正警告,以選擇測試該介面時所要使用的類別。

    Screenshot of Fix warning.

    Screenshot of Fix warning.

    這個選擇會加入 PexAssemblyInfo.cs 檔案中。

    [assembly: PexUseType(typeof(Camera))]

  3. 接著您可以重新執行 IntelliTest,並使用您剛才修正的類別,產生參數型單元測試及測試資料。

    Screenshot of Rerun IntelliTest after fix.

    Screenshot of Rerun IntelliTest after fix.

指定:使用 IntelliTest 來驗證您在程式碼中指定之屬性的正確性

指定輸入和輸出之間的一般關聯性,以用產生的單元測試來驗證。 此規格的封裝方法看似測試方法,但它卻是通用數量化的規格。 這是參數化的單元測試方法,因此您所進行的任何判斷提示必須保留所有 IntelliTest 產生的可能輸入值。

問與答

問:IntelliTest 適用於 Unmanaged 程式碼嗎?

答: 不適用,IntelliTest 只適用於 Managed 程式碼。

問:產生的測試會在何時成功或失敗?

答: 一如其他單元測試般,只要未發生任何例外狀況,測試便會成功。 當有任何判斷提示失敗,或有測試的程式擲回無法處理的例外狀況時,測試便會失敗。

若您的測試在擲回某些例外狀況時仍能成功,可以依據您的需求,在測試方法、測試類別或組件層級設定下列屬性:

  • PexAllowedExceptionAttribute

  • PexAllowedExceptionFromTypeAttribute

  • PexAllowedExceptionFromTypeUnderTestAttribute

  • PexAllowedExceptionFromAssemblyAttribute

問:我可以在參數型單元測試中加入假設嗎?

答: 可以,您可以使用假設,為特定方法的單元測試指定不需要的測試資料。 您可以使用 PexAssume 類別加入假設。 例如,您可以如以下範例般,新增 lengths 變數不是 Null 的假設:

PexAssume.IsNotNull(lengths);

加入假設之後,請重新執行 IntelliTest,以移除不再相關的測試資料。

問:我可以在參數型單元測試中加入判斷提示嗎?

答: 可以,IntelliTest 會在執行單元測試時,檢查陳述式中的判斷提示是否符合實際情況。 使用 PexAssert 類別或測試架構隨附的判斷提示 API,以加入判斷提示。 例如,您可以加入判斷提示,指出兩個變數相等。

PexAssert.AreEqual(a, b);

當您新增判斷提示並重新執行 IntelliTest 時,它會檢查該判斷提示是否有效,若無效,則測試會失敗。

問: 是否可以產生參數化的單元測試而不需先執行 IntelliTest?

答: 可以,只要以滑鼠右鍵按一下類別或方法,然後選擇 [建立 IntelliTest] 即可。

Screenshot of Create IntelliTest.

Screenshot of Create IntelliTest.

接受預設格式以產生測試,或變更專案和測試的命名方式。 您可以建立新的測試專案,或將您的測試儲存至現有的專案。

Screenshot of Create IntelliTest with MSTest default.

Screenshot of Create IntelliTest with MSTest default.

問: 是否可以使用其他單元測試架構搭配 IntelliTest?

答: 可以,請遵循 尋找並安裝其他架構中的步驟。 Visual Studio Marketplace 也提供測試架構延伸模組,例如 NUnit 測試產生器

重新啟動 Visual Studio 並重新開啟方案之後,以滑鼠右鍵按一下類別或方法,然後選擇 [建立 IntelliTest] 。 於此處選取您已安裝的架構:

Screenshot of Select other unit test framework for IntelliTest.

Screenshot of Select other unit test framework for IntelliTest.

然後執行 IntelliTest,以在對應的 g.cs 檔案中產生個別的單元測試。

問:我可以進一步了解如何產生測試嗎?

答: 可以,如需高階概觀,請閱讀這篇 部落格文章