Live Unit Testing 常見問題集

支援的架構

Live Unit Testing 支援哪些測試架構,而且支援的最低版本為何?

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

測試架構 Visual Studio 配接器最小版本 架構最小版本
xUnit.net xunit.runner.visualstudio 版本 2.2.0-beta3-build1187 xunit 1.9.2
NUnit NUnit3TestAdapter 版本 3.7.0 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。

.NET Core 支援

Live Unit Testing 是否可以與 .NET Core 搭配使用?

是。 Live Unit Testing 可以與 .NET Core 和 .NET Framework 搭配使用。

組態

當我開啟 Live Unit Testing 時,為什麼它不會運作?

[輸出] 視窗 (選取 Live Unit Testing 下拉式清單時) 應該會說明 Live Unit Testing 為何無法運作。 Live Unit Testing 不會運作的可能原因如下:

  • 如果方案中之專案所參考的 NuGet 封裝尚未還原,Live Unit Testing 將不會運作。 在開啟 Live Unit Testing 之前,請先執行明確建置方案,或是還原方案中的 NuGet 套件,應該就能解決此問題。

  • 如果您在專案中使用以 MSTest 為基礎的測試,請務必移除對 Microsoft.VisualStudio.QualityTools.UnitTestFramework 的參考,然後新增對最新 MSTest NuGet 套件的參考,MSTest.TestAdapter (至少需要版本 1.1.11) 和 MSTest.TestFramework (至少需要版本 1.1.11)。 如需詳細資訊,請參閱使用 Visual Studio 中的 Live Unit Testing 一文的<支援的測試架構>一節。

  • 您的方案中應該至少要有一個專案含有參考 xUnit、NUnit 或 MSTest 測試架構的 NuGet 參考或直接參考。 此專案應該也要參考對應的 Visual Studio 測試配接器 NuGet 封裝。

為什麼我的專案未建置?

選取 [Live Unit Testing] 下拉式清單時,系統會將建置錯誤回報給 [輸出] 視窗。 在安裝精靈中不正確的設定會造成一些常見的問題,可能會導致 Live Unit Testing 中的建置問題。

  • 如果 Workspace Root 屬性太長,建置可能會因為指出路徑太長而失敗。

  • 如果存放庫根屬性未指向儲存機制根路徑目錄,工作區將會填入錯誤的檔案集。

  • 針對 git 存放庫,Exclude files 屬性通常可避免複製 gitignore 檔案中所指定的檔案。 不過,可以將檔案簽入忽略的 Git 存放庫,或可執行自動產生檔案的工具,但在建置期間不會產生這些檔案。 在這些情況下,應該選擇 [自訂]<> 選項,並且只列出成品資料夾的自訂規則集。

除了先前所述的問題之外,還有下列可能無法正確建置的專案組態。

  • 如果專案相依性指定為全域方案組態,而不是針對每個專案指定為 ProjectReferences,Live Unit Testing 最終可能會建置不正確的專案集。 若要修正此問題,請在專案之間新增明確的參考。

  • 在選擇 Live Unit Testing 播放清單之前,Live Unit Testing 將不會建置任何專案。 若要修正此問題,請在 Live Unit Testing 播放清單中包含一些測試。

  • 如果您在專案中使用以 MSTest 為基礎的測試,請務必移除對 Microsoft.VisualStudio.QualityTools.UnitTestFramework 的參考,然後新增對最新 MSTest NuGet 套件的參考,MSTest.TestAdapter (至少需要版本 1.1.11) 和 MSTest.TestFramework (至少需要版本 1.1.11)。 如需詳細資訊,請參閱支援的測試架構

  • 您的方案中應該至少要有一個專案含有參考 xUnit、NUnit 或 MSTest 測試架構的 NuGet 參考或直接參考。 此專案應該也要參考對應的 Visual Studio 測試配接器 NuGet 封裝。 Visual Studio 測試配接器也可以透過 .runsettings 檔案來參考。 .runsettings 檔案必須具有類似下列範例的項目:

<RunSettings>
    <RunConfiguration>
          <TestAdaptersPaths>path-to-your-test-adapter</TestAdaptersPaths>
    </RunConfiguration>
</RunSettings>

為什麼我的測試無法執行?

  • 常見的問題是,並非所有的檔案都會複製到測試檔案夾。 您可能必須將一些 Live Unit Testing Test Dependency 項目新增至 csproj 檔案。

  • 另一個問題是逾時。 由於 Live Unit Testing 會無限期地執行測試,因此如果測試執行的時間太長,其會自動中止執行。 您可以在專案的精靈中增加逾時。

升級後不正確的涵蓋範圍

為什麼您將 Visual Studio 專案中參考的測試配接器升級到支援版本之後,Live Unit Testing 顯示不正確的涵蓋範圍?

  • 如果解決方案中的多個專案參考 NuGet 測試配接器套件時,每個都必須升級為支援的版本。

  • 請確定從測試配接器套件匯入的 MSBuild .props 檔案也正確地更新。 檢查 NuGet 套件版本/匯入路徑,這通常可以在接近專案檔上方找到,如下所示︰

      <Import Project="..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.2.0\build\net20\xunit.runner.visualstudio.props')" />
    

自訂組建

我是否可以自訂 Live Unit Testing 組建?

如果您的解決方案需要非「一般」非檢測組建所需的自訂步驟,以針對檢測設備 (Live Unit Testing) 進行建置,您可以將程式碼新增至專案或 .targets 檔案來檢查 BuildingForLiveUnitTesting 屬性,並執行自訂的建置前/後步驟。 您也可以根據這個專案屬性,選擇針對 Live Unit Testing 組建移除特定的建置步驟 (例如發佈或產生封裝),或新增建置步驟 (例如複製必要條件)。 根據這個屬性自訂您的組建不會以任何方式更改您的一般組建,且只會影響 Live Unit Testing 組建。

例如,可能有一個目標會在一般建置期間產生 NuGet 封裝。 您可能不想讓 NuGet 封裝在每次進行編輯之後產生。 因此您可以執行類似下列的內容,在 Live Unit Testing 組建中停用該目標:

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

測試總管與 Live Unit Testing

從 [測試總管] 視窗執行測試,與在 Live Unit Testing 中執行測試有何不同?

差異如下:

  • 從 [測試總管] 視窗針對測試進行執行或偵錯會執行一般的二進位檔,而 Live Unit Testing 會執行已檢測的二進位檔。 如果您想要偵錯已檢測的二進位檔,在您的測試方法中新增 Debugger.Launch 方法呼叫會導致偵錯工具在每次執行該方法時 (包括 Live Unit Testing 執行該方法時) 啟動,您接著便可以附加已檢測的二進位檔,並對它進行偵錯。 不過,我們希望檢測設備在大部分的使用者案例中對您而言是透明的,且您不會需要對已檢測的二進位檔進行偵錯。

  • Live Unit Testing 不會建立新的應用程式定義域來執行測試,但從 [測試總管] 視窗中執行的測試會建立新的應用程式定義域。

  • Live Unit Testing 會循序執行每個測試組件中的測試。 在 [測試總管] 中,您可以選擇平行執行多個測試。

  • 根據預設,[測試總管] 會在單一執行緒 Apartment (STA) 中執行測試,而 Live Unit Testing 會在多執行緒 Apartment (MTA) 中執行測試。 若要在 Live Unit Testing 於 STA 中執行 MSTest 測試,請利用可在 MSTest.STAExtensions 1.0.3-beta NuGet 封裝中找到的 <STATestMethod><STATestClass> 屬性,來裝飾測試方法或包含類別。 針對 NUnit,請使用 <RequiresThread(ApartmentState.STA)> 屬性來裝飾測試方法,而針對 xUnit,請使用 <STAFact> 屬性。

排除測試

如何從 Live Unit Testing 排除測試?

請參閱使用 Visual Studio 中的 Live Unit Testing 一文章的<包含和排除測試專案與測試方法>一節,以了解使用者的特定設定。 若您想要針對特定的編輯工作階段執行一組特定的測試,或保存您個人的喜好設定,包含或排除測試非常有用。

針對方案特定的設定,您可以以程式設計方式套用 System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute 屬性,以排除方法、屬性、類別或結構,使 Live Unit Testing 不會檢測它們。 此外,您也可以在專案檔中將 <ExcludeFromCodeCoverage> 屬性設為 true,以排除對整個專案的檢測。 Live Unit Testing 仍然會執行尚未檢測的測試,但不會將它們的涵蓋範圍視覺化。

您也可以檢查是否已將 Microsoft.CodeAnalysis.LiveUnitTesting.Runtime 載入目前的應用程式定義域,並據以停用測試。 例如,您可以針對 xUnit 執行下列動作:

[ExcludeFromCodeCoverage]
public class SkipLiveFactAttribute : FactAttribute
{
   private static bool s_lutRuntimeLoaded = AppDomain.CurrentDomain.GetAssemblies().Any(a => a.GetName().Name ==
                                            "Microsoft.CodeAnalysis.LiveUnitTesting.Runtime");
   public override string Skip => s_lutRuntimeLoaded ? "Test excluded from Live Unit Testing" : "";
}

public class Class1
{
   [SkipLiveFact]
   public void F()
   {
      Assert.True(true);
   }
}

連續組建

為什麼 Live Unit Testing 會持續建置我的方案,即使我沒有做出任何編輯也一樣?

如果建置流程會產生屬於解決方案本身的原始程式碼,而您的建置目標檔案並未指定適當的輸入和輸出,即使您未進行編輯,您也可以建置解決方案。 您應該為目標提供輸入和輸出清單,讓 MSBuild 可以執行適當的更新狀態檢查,並判斷是否需要新的組建。

每當 Live Unit Testing 偵測到原始程式檔已變更時,即會開始建置。 由於您方案的組建會產生原始程式檔,Live Unit Testing 將陷入無限的建置迴圈。 不過,如果在 Live Unit Testing 開始第二個組建時 (從上一個組建中偵測到新產生的原始程式檔之後) 檢查目標的輸入和輸出,它就會脫離該建置迴圈,因為輸入和輸出檢查將指出一切均為最新狀態。

編輯器圖示

儘管根據輸出視窗中的訊息,Live Unit Testing 似乎正在執行測試,但為什麼我在編輯器中看不到任何圖示?

如果 Live Unit Testing 正在運作的組件基於任何原因而未進行檢測,您可能在編輯器中看不到圖示。 例如,Live Unit Testing 與設定 <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable> 的專案不相容。 在此情況下,您的建置流程需要更新以移除此設定,或將該設定變更為 true,Live Unit Testing 才能夠運作。 

擷取記錄

如何收集更詳細的記錄以提出錯誤報告?

您可以執行數個動作來收集更詳細的記錄:

  • 移至 [工具]>[選項]>[Live Unit Testing],然後將記錄選項變更為 [詳細資訊]。 詳細資訊記錄會使 [輸出] 視窗顯示更詳細的記錄。

  • LiveUnitTesting_BuildLog 使用者環境變數設為您想要用來擷取 MSBuild 記錄的檔案名稱。 然後就能從該檔案中擷取來自 Live Unit Testing 組建的詳細 MSBuild 記錄訊息。

  • LiveUnitTesting_TestPlatformLog 使用者環境變數設成 1 以擷取測試平台記錄檔。 然後就能從該 [Solution Root]\.vs\[Solution Name]\log\[VisualStudio Process ID] 中擷取來自即時單元測試回合的詳細測試平台記錄訊息。

  • 建立名為 VS_UTE_DIAGNOSTICS 的使用者層級環境變數,並將它設為 1 (或任何值),然後重新啟動 Visual Studio。 現在您應該會在 Visual Studio 的 [輸出 - 測試] 索引標籤中看見許多記錄。

工作區資料夾

我可以編輯工作區資料夾底下的檔案嗎?

否,您不應該在工作區資料夾的組建和測試目錄底下開啟或編輯檔案。 Live Unit Testing 應該管理 src 資料夾中的所有檔案,以在儲存機制根路徑工作區根路徑之間保持同步。

開發磁碟機

Live Unit Testing 是否支援預設工作區根路徑的開發磁碟機?

是,但您必須確定已啟用。 如果您使用開發磁碟機,請確定已啟用投影檔案系統 (ProjFS) 篩選器。 例如,下列命令會啟用 ProjFS 和 Windows Defender:

fsutil devdrv setfiltersallowed PrjFlt, WdFilter

另請參閱