設定及使用 Live Unit Testing

當您開發應用程式時,Live Unit Testing 會在背景自動執行任何受影響的單元測試,並即時呈現結果和程式碼涵蓋範圍。 當您修改程式碼時,Live Unit Testing 會針對您的變更如何影響現有測試,以及您所增加的新程式碼是否受到一或多個現有測試涵蓋提供反饋。 這類反饋可提醒您在進行錯誤修正或新增功能時撰寫單元測試。

當您使用 Live Unit Testing 進行測試時,它會保存測試狀態的相關資料。 使用保存的資料可讓 Live Unit Testing 提供卓越的效能,同時隨著程式碼變更動態執行您的測試。

Live Unit Testing 僅適用於以 .NET Core 或 .NET Framework 為目標之專案的 Visual Studio Enterprise 版本。

支援的測試架構

Live Unit Testing 適用於下表所列的三種熱門單元測試架構。 此外也會顯示其配接器與架構支援的最低版本。 單元測試架構全都可從 NuGet.org 取得。

測試架構 Visual Studio 配接器最低版本 架構最小版本
xUnit.net xunit.runner.visualstudio 版本 2.2.0-beta3-build1187 xunit 1.9.2
NUnit NUnit3TestAdapter 版本 3.5.1 NUnit 版本 3.5.0
MSTest MSTest.TestAdapter 1.1.4-preview MSTest.TestFramework 1.0.5-preview

如果您的舊型 MSTest 測試專案參考了 Microsoft.VisualStudio.QualityTools.UnitTestFramework,但您不想要移至新版 MSTest NuGet 套件,請升級至 Visual Studio 2019 或 Visual Studio 2017。

在某些情況下,您可能需要明確還原專案所參考的 NuGet 套件,讓 Live Unit Testing 能夠運作。 您有兩個選擇:

  • 藉由執行解決方案的明確建置進行還原。 在最上層 Visual Studio 功能表中,選取 [建置]>[重建解決方案]
  • 還原解決方案中的套件。 以滑鼠右鍵按一下解決方案,然後選取 [還原 NuGet 套件]

設定

第一次為解決方案啟動 Live Unit Testing 時,可以使用設定精靈來設定 Live Unit Testing 建置及執行測試的方式。

Live Unit Testing 停止時,您也可以移至 [測試]>[Live Unit Testing]>[設定解決方案的 Live Unit Testing] 以開啟設定精靈。

Live Unit Testing 執行時會建立工作區,這是原始存放庫的複本。 接著,Live Unit Testing 會將您在 Visual Studio 中所做的任何未儲存變更套用至工作區、執行組建、執行測試回合,以及報告最新的程式碼涵蓋範圍。

您應使用精靈進行的第一項設定,是應從何處複製檔案,以及將檔案複製到何處。

螢幕擷取畫面顯示 Live Unit Testing 設定精靈第 1 頁。

存放庫根路徑

存放庫根路徑會指定要複製以建立 Live Unit Testing 工作區的資料夾。 此路徑應為存放庫的根資料夾,也就是說,應包含所有來源、二進位檔和工具。 如果解決方案檔案不存在於存放庫根路徑下,則可能需要變更存放庫根路徑。

工作區根目錄

工作區根目錄會指定 Live Unit Testing 保存存放庫複本的資料夾。 請留意指出路徑太長的例外狀況。 根據預設,根目錄會建立在主資料夾下。 但若您通常需要在磁碟機 C 下建立存放庫 (舉例而言),則可將工作區根目錄調整為 C:\lut\Repo 之類的路徑。

指定排除的檔案

並非所有檔案都應複製到 Live Unit Testing 工作區。 建置期間產生的任何成品都應排除於複製外,讓一般組建不會干擾 Live Unit Testing 組建。 此外,一般 nuget restore 命令不應干擾 Live Unit Testing nuget restore 命令。

根據預設,Live Unit Testing 會排除下列兩種檔案模式之一:

  • 對於 Git 存放庫,指定於 gitignore 檔案中的檔案不會複製到 Live Unit Testing 工作區。
  • 對於非 Git 存放庫,bin/obj/ 之類的基本資料夾清單不會複製到 Live Unit Testing 工作區。

對於更複雜的存放庫,您可能需要自行指定忽略檔案。 從精靈中選取 [自訂]<> 選項。 選取 [下一步] 後,即會顯示 Live Unit Testing 在您完成精靈之後建立的自訂忽略檔案內容。 這是 lutignore 檔案。

注意

某些 Git 存放庫需要自訂 lutignore 檔案,因為簽入 Git 存放庫中的檔案也有可能被 gitignore 檔案忽略。 若沒有自訂 lutignore 檔案,Live Unit Testing 就不會複製這些檔案,這可能會導致組建失敗。

lutignore 檔案結構

lutignore 檔案使用與 gitignore 檔案相同的格式。 其中應包含將建置期間產生的資料夾或檔案進行比對的規則,使其不會複製到工作區中。 對多數預設專案範本而言,下列忽略檔案即已足夠:

[BB]IN
[OO]BJ
# WILL NOT COPY ANY BIN AND OBJ FOLDERS TO THE LIVE UNIT TESTING WORKSPACE

如果您的存放庫只有一個組建資料夾,則忽略檔案應列出該資料夾:

[AA]RTIFACTS/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE

如果您的存放庫在組建資料夾中包含一些其他工具,則應在比對模式集合中排除這些工具:

[AA]RTIFACTS/
![AA]RTIFACTS/TOOLS/
# WILL NOT COPY THE ARTIFACTS FOLDER TO THE LIVE UNIT TESTING WORKSPACE
# HOWEVER IT WILL COPY THE TOOLS SUBFOLDER THAT MIGHT CONTAIN TOOLS AND UTILITIES

建置選項

精靈設定頁面的第二個部分是您設定建置選項的位置:

  • 產生 PDB:為了加速建置,Live Unit Testing 在建置期間不會產生 PDB。 這些符號檔可讓您在測試失敗時移至堆疊追蹤。
  • 使用多個 CPU 核心建置:根據預設,Live Unit Testing 會使用多個 CPU 核心來執行組建,進而加快建置時程。 如果您的機器速度變慢,或是解決方案無法使用多個處理器來建置,請勿選取此選項。

測試回合選項

精靈設定頁面的最後一個部分是您設定測試回合選項的位置:

  • 測試案例逾時:執行某些測試可能會很耗時。 設定此欄位,可在任何測試超過特定持續時間時自動中止執行。 測試可以自動取消。
  • 使用多個處理器:根據預設,Live Unit Testing 會嘗試使用多個處理器以提升執行效能。 如果您的機器速度變慢,或是解決方案無法平行執行測試,請勿選取此選項。 例如,如果多個測試嘗試從相同的檔案路徑寫入/讀取,就可能發生這些情況。

更多設定

選取最上層 Visual Studio 功能表列上的 [工具]>[選項],以設定 Live Unit Testing。 在 [選項] 對話方塊的左窗格,選取 [Live Unit Testing]

Live Unit Testing 啟用後 (請參閱啟動、暫停和停止 Live Unit Testing),您也可以選取 [測試]>[Live Unit Testing]>[選項] 以開啟 [選項] 對話方塊。

下圖顯示對話方塊中提供的 Live Unit Testing 設定選項。

螢幕擷取畫面顯示 Live Unit Testing 設定選項。

可設定的選項包括:

  • 在解決方案完成建置及偵錯之後,Live Unit Testing 是否會暫停。

  • 系統的電池電力低於指定的閾值時,Live Unit Testing 是否會暫停。

  • 能夠刪除所有保存資料的功能。 Live Unit Testing 若發生無法預測或非預期的行為,保存的資料就會損毀,這時此功能就有其效用。

  • Live Unit Testing 程序可以使用的記憶體數量上限。

  • 寫入至 Live Unit Testing [輸出] 視窗的資訊層級。

    選項包括不記錄 ([無])、僅限錯誤訊息 ([錯誤])、錯誤與資訊訊息 ([資訊],預設值) 或所有詳細資料 ([詳細資訊])。

    您也可以在 Live Unit Testing 的 [輸出] 視窗中顯示詳細資訊輸出,方法是將值 1 指派給名為 VS_UTE_DIAGNOSTICS 的使用者層級環境變數。 然後,重新啟動 Visual Studio。

    若要在檔案中擷取來自 Live Unit Testing 的詳細 MSBuild 記錄訊息,請將 LiveUnitTesting_BuildLog 使用者層級環境變數設為該檔案的名稱,以包含記錄。

自訂 Live Unit Testing 的組建

對於較複雜的解決方案,可能需要進一步自訂群組建。 例如,您可能不需要在測試回合期間建置翻譯檔案。 若要加速建置,您可以使用 Live Unit Testing 將翻譯檔案組建停用。 您可以藉由操作專案檔來執行此動作。

新增 Live Unit Testing 覆寫

如果您的解決方案需要「一般」非檢測組建不需要的自訂步驟,以針對檢測設備 (Live Unit Testing) 進行建置,您可以將程式碼新增至專案或 .targets 檔案,以檢查 BuildingForLiveUnitTesting 屬性並執行自訂的建置前/後步驟。

例如,您可以撰寫下列範例,以新增僅針對 Live Unit Testing 執行的另一個目標:

<Target Name="GenerateNuGetPackages" BeforeTargets="AfterBuild" Condition="'$(BuildingForLiveUnitTesting)' == 'true'">
    <Exec Command='"$(MSBuildThisFileDirectory)..\tools\GenPac" '/>
</Target>

您可以使用 BuildingForLiveUnitTesting 屬性,停用某些不應針對測試組建執行的工作。 例如,Live Unit Testing 可設定 <RunAnalyzers>false</RunAnalyzers> 以停用測試的分析器。

Live Unit Testing 測試相依性

執行測試所需的所有檔案不一定都會複製。 Live Unit Testing 會建立個別資料夾,以在其中執行測試。 在這種安排下,組建可以與測試同時執行,但並非所有來自組建資料夾的檔案都會複製到測試資料夾。

您新增測試相依性通常基於以下兩個原因之一:

  • 您的測試依存於來源樹狀結構下的檔案。 例如,測試會檢查 resx 檔案的內容,或可能會讀取一些組態檔。
  • 您的測試依存於其參考的某些程式庫。 例如,測試執行建置為相依性的可執行檔。

注意

測試相依性必須存在於設定精靈中指定為存放庫根路徑的目錄。

在這兩種情況下,Live Unit Testing 依預設都不會複製這些檔案,以期能盡量減少為了執行測試而需複製的檔案數目。 如果某個測試回合有需要,您必須使用 LiveUnitTestingTestDependency 屬性明確指定這些檔案。 例如,假設我們有下列配置:

SRC/
  CONSOLE_UTILITY/
  TEST_PROJECT/
ARTIFACTS/
  CONSOLE_UTILITY/NET472/DEBUG/
  TEST_PROJECT/NET472/DEBUG/

根據預設,當您使用 Live Unit Testing 建置這些專案時,它只會將 Artifacts/Test_Project 複製到測試資料夾。 若要將來源或 console_utility 新增至測試資料夾,請將下列範例新增至 test_project.csproj

<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Src/ConsoleUtility” />
<LiveUnitTestingTestDependency Include=”$(RepoRoot)/Artifacts/ConsoleUtility/net472/$(Configuration)/</LiveUnitTestingTestDependency” />

啟動、暫停和停止

若要啟用 Live Unit Testing,請在最上層的 Visual Studio 功能表上選取 [測試]>[Live Unit Testing]>[啟動]。 Live Unit Testing 啟用時,[Live Unit Testing] 功能表上的可用選項會從單一項目 [啟動] 變更為 [暫停] 和 [停止]

  • [暫停] 會暫時停止 Live Unit Testing。

    Live Unit Testing 暫停時,涵蓋範圍的視覺效果不會出現在編輯器中,但會保留所有已收集的資料。 若要繼續進行 Live Unit Testing,請選取 [Live Unit Testing] 功能表上的 [繼續]。 Live Unit Testing 會執行必要的工作來更新在暫停期間所做的所有編輯,且會適當地更新字符。

  • [停止] 會完全停止 Live Unit Testing。 Live Unit Testing 會捨棄所有已收集的資料。

如果您在未包含單元測試專案的解決方案中啟動 Live Unit Testing,則 [Live Unit Testing] 功能表上會出現 [暫停] 和 [停止] 選項,但 Live Unit Testing 不會啟動。 [輸出] 視窗會顯示開頭如下的訊息:「此解決方案未參考支援的測試配接器...」。

您隨時都能暫時停止或完全停止 Live Unit Testing。 例如,如果您正在進行重構,並知道測試會因此中斷一段時間,您就可能採取這些動作。

包含和排除測試專案與測試方法

在啟動 Live Unit Testing 後,[Live Unit Testing] 工具視窗隨即出現,並提示您選取要由 Live Unit Testing 測試的測試集。

螢幕擷取畫面顯示第一次啟動 Live Unit Testing 時所顯示的工具視窗。

對於單元測試很快就能執行完畢的小型解決方案,請選取 [包含所有測試],讓 Live Unit Testing 執行所有測試。

對於具有許多測試專案的大型解決方案,您可藉由編輯播放清單,來控制要讓哪些專案、以及專案中的哪些個別方法參與 Live Unit Testing。 例如,如果您的方案具有數百個測試專案,則您可以選取一組目標測試專案來參與 Live Unit Testing。

您可藉由編輯 Live Unit Testing 播放清單來選擇 Live Unit Testing 所應執行的項目,此功能的運作方式就像測試總管中的播放清單一樣。

有多種方式可以編輯 Live Unit Testing 播放清單:

  • Live Unit Testing 工具視窗
  • 程式碼編輯器視窗
  • 方案總管
  • 在測試程式碼中以程式設計方式進行

Live Unit Testing 會將包含/排除狀態儲存為使用者設定,且在解決方案關閉並重新開啟後仍會記住該狀態。

Live Unit Testing 工具視窗

您可以使用 [Live Unit Testing] 索引標籤的播放清單編輯器,將專案、命名空間或類別包含在執行中或排除在外。 在工具視窗中選取 [編輯播放清單]

您可以選取或清除樹狀檢視元素,以包含或排除測試。 例如,如果您勾選單一測試,擇 Live Unit Testing 會在變更時加以執行。 如果您選取類別,則該類別中的所有測試都會執行,且新增至該類別的任何新測試也都會執行。

螢幕擷取畫面顯示 Live Unit Testing 播放列表編輯器。

程式碼編輯器視窗

您可以使用程式碼編輯器視窗來包含或排除個別的測試方法。 在程式碼編輯器視窗中以滑鼠右鍵按一下測試方法的簽章或主體,然後選取下列其中一個選項:

  • Live Unit Testing>包含 <選取的方法>
  • Live Unit Testing>排除 <選取的方法>
  • Live Unit Testing>除 <選取的方法> 之外全部排除

方案總管

若要在單元測試中選取個別專案,請在 Live Unit Testing 啟動後執行下列步驟:

  1. 以滑鼠右鍵按一下 [方案總管] 中的解決方案,然後選取 [Live Unit Testing]>[排除] 以排除整個解決方案。
  2. 以滑鼠右鍵按一下要包含在測試中的每個測試專案,然後選取 [Live Unit Testing]>[包含]

在測試程式碼中以程式設計方式進行

您可以套用 ExcludeFromCodeCoverageAttribute 屬性,來以程式設計方式排除方法、類別或結構,使它們不會在 Live Unit Testing 中報告它們的涵蓋範圍。

使用下列屬性將個別方法排除在 Live Unit Testing 外:

  • xUnit[Trait("Category", "SkipWhenLiveUnitTesting")]
  • NUnit[Category("SkipWhenLiveUnitTesting")]
  • MSTest[TestCategory("SkipWhenLiveUnitTesting")]

使用下列屬性將整個測試組件排除在 Live Unit Testing 外:

  • xUnit[assembly: AssemblyTrait("Category", "SkipWhenLiveUnitTesting")]
  • NUnit[assembly: Category("SkipWhenLiveUnitTesting")]
  • MSTest[assembly: TestCategory("SkipWhenLiveUnitTesting")]

檢視涵蓋範圍視覺效果

Live Unit Testing 一經啟用後,就會更新 Visual Studio 編輯器中的每個程式碼,以顯示單元測試是否涵蓋您撰寫的程式碼,以及涵蓋該程式碼的測試是否順利通過。

下圖顯示測試通過和測試失敗的程式碼,以及測試未涵蓋的程式碼。 具有綠色 "✓" 的程式碼僅由通過的測試涵蓋。 具有紅色 "x" 的程式碼由一或多個失敗的測試所涵蓋。 具有藍色 "➖" 的程式碼不受任何測試涵蓋。

螢幕擷取畫面顯示 Visual Studio 的程式碼涵蓋範圍。

當您在程式碼編輯器中修改程式碼時,系統會立即更新 Live Unit Testing 涵蓋範圍的視覺效果。 處理編輯時,視覺效果會隨之變更,在通過、失敗及未涵蓋符號下方新增圓形計時器影像,以指出資料不是最新狀態,如下圖所示。

螢幕擷取畫面顯示具計時器圖示的 Visual Studio 程式碼涵蓋範圍。

取得測試狀態的相關資訊

將滑鼠暫留在程式碼視窗中的通過或失敗符號上方,您就能看到已針對該行程式碼做出多少測試。 若要查看個別測試的狀態,請選取符號。

螢幕擷取畫面顯示 Visual Studio 的符號測試狀態。

除了提供測試的名稱和結果以外,工具提示也可讓您重新執行一組測試或加以偵錯。 您也可以選取工具提示中的一或多個測試,而僅執行那些測試或對其偵錯。 此動作可讓您直接對測試偵錯,而無須離開程式碼視窗。

進行偵錯時,除了觀察您已設定的任何中斷點以外,程式也會在偵錯工具執行的 Assert 方法傳回非預期結果時暫停執行。

當您將滑鼠暫留在工具提示中的失敗測試上方時,工具提示會展開以提供更多關於失敗的資訊,如下圖所示。 若要直接移至失敗的測試,請在工具提示中按兩下該測試。

螢幕擷取畫面顯示 Visual Studio 的失敗測試工具提示資訊。

當您移至失敗的測試時,Live Unit Testing 會在方法簽章中以視覺化方式指出測試:

  • 通過 (以半滿的燒杯與綠色 "✓" 表示)。
  • 失敗 (以半滿的燒杯與紅色 "🞩" 表示)。
  • 未參與 Live Unit Testing (以半滿的燒杯與藍色 ➖ 表示)。

非測試方法未以符號識別。 下圖說明這四種類型的方法。

螢幕擷取畫面顯示具已傳遞或失敗符號的 Visual Studio 測試方法。

診斷並修正測試失敗

從失敗的測試,您可以輕鬆對產品程式碼進行偵錯、加以編輯,並繼續開發應用程式。 由於 Live Unit Testing 是在背景執行,因此您不需要在偵錯、編輯和繼續的循環期間停止並重新啟動 Live Unit Testing。

例如,上圖所示的測試失敗,是因為測試方法中錯誤假設了非字母字元在傳至 System.Char.IsLower 方法時會傳回 true 而導致的。 更正測試方法後,所有測試應該都會通過。 您不需要暫停或停止 Live Unit Testing。

Live Unit Testing 視窗

Live Unit Testing 類似於測試總管,都提供讓您執行和偵錯測試以及分析測試結果的介面。 Live Unit Testing 啟用時,測試總管中的單元測試狀態會立即更新。 您不需要明確執行單元測試。

Live Unit Testing 未啟用或已停止時,Live Unit Testing 會顯示上次執行測試時的單元測試狀態。 重新啟動 Live Unit Testing 後,必須變更原始程式碼以重新執行測試。

您可以在最上層 Visual Studio 功能表上選取 [測試]>[Live Unit Testing]>[啟動],以啟動 Live Unit Testing。 您也可以使用 [檢視]>[其他視窗]>[Live Unit Testing 視窗] 來開啟 [Live Unit Testing] 視窗。

在 [Live Unit Testing] 視窗中,您可能會發現某些測試已呈現為暗灰色。例如,當您停止並重新啟動 Live Unit Testing 後,[Live Unit Testing] 視窗會將所有測試呈現為暗灰色,如下圖所示。

測試結果若呈現為暗灰色,表示該測試不是最新 Live Unit Test 回合的一部分。 只有在偵測到測試的變更或測試的相依性時,測試才會執行。 如果沒有變更,就會避免不必要地執行測試。 在此情況下,呈現為灰色的測試結果即便不是最新回合的一部分,仍然是「最新的」。

螢幕擷取畫面顯示測試總管的淡出測試。

您可以進行程式碼變更,以重新執行任何呈現為暗灰色的測試。

在 Live Unit Testing 自動執行並更新測試結果,以及從 [測試總管] 明確執行測試之間,具有一些差異。 這些差異包括:

  • 從 [測試總管] 視窗執行測試或加以偵錯,會執行一般的二進位檔。 Live Unit Testing 會執行已檢測的二進位檔。
  • Live Unit Testing 不會建立新的應用程式定義域來執行測試。 實際上,會從預設定義域執行測試。 從 [測試總管] 視窗執行的測試會建立新的應用程式定義域。
  • Live Unit Testing 會循序執行每個測試組件中的測試。 在 [測試總管] 視窗中,您可以選擇平行執行多個測試。

取消 Live Unit Testing 測試回合

Live Unit Testing 在您進行任何程式碼變更時,都會持續執行測試。 如果您在某回合進行期間做了更多程式碼變更,Live Unit Testing 會等候第一個回合完成,同時將另一個回合排入佇列。

每當您儲存檔案,Live Unit Testing 就會取消第一個回合,並立即排程已排入佇列的回合。 在第一個回合需要長時間才能完成的情況下,此程序將有所幫助。

另請參閱