編輯

共用方式為


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

如果您有參考 Microsoft.VisualStudio.QualityTools.UnitTestFramework 且不想移至較新的 MSTest NuGet 套件的 MSTest 型測試專案,請升級至 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一节。

  • 方案中至少有一個項目應該有 NuGet 參考或直接參考 xUnit、NUnit 或 MSTest 測試架構。 此專案也應該參考對應的 Visual Studio 測試配接器 NuGet 套件。

為什麼我的專案未建置?

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

  • 如果 工作區根目錄 屬性太長,建置可能會因為指出路徑太長而失敗。

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

  • 針對 git 存放庫,排除檔案 屬性通常可避免複製 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 版)。 如需詳細資訊,請參閱 支援的測試架構

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

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

Live Unit Testing 是否支援來源產生器專案?

Live Unit Testing 無法使用檢測來建置來源產生器專案。 由於 C# 編譯程式如何設定來源產生器的元件載入,嘗試建置具有檢測的來源產生器項目無法載入 Live Unit Testing 元件。

您可以在來源產生器 csproj 檔案中設定 <ExcludeFromCodeCoverage>true</ExcludeFromCodeCoverage> 屬性,讓這些專案在 Live Unit Testing 中建置。

如何解決錯誤「無法載入檔案或元件 』Microsoft.Bcl.AsyncInterfaces』」?

Live Unit Testing 會基於效能考慮,在自己的程式內執行組建。 如果這個個別的建置程式造成錯誤,您可以將 <UseInProcMSBuildNode>false</UseInProcMSBuildNode> 設定為 .lutconfig 檔案,以確保所有組建都會在 MSBuild 程式中發生。

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

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

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

升級后的涵蓋範圍不正確

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

  • 如果方案中有多個項目參考 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)> 屬性來裝飾測試方法,並使用 <STAFact> 屬性裝飾 xUnit。

排除測試

如何排除測試不參與 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 可以執行適當的 up-to日期檢查,並判斷是否需要新的組建。

每當即時單元測試偵測到來源檔案已變更時,就會啟動組建。 因為解決方案的建置會產生來源檔案,因此 Live Unit Testing 會進入無限的建置迴圈。 不過,如果在 Live Unit Testing 啟動第二個組建時檢查目標的輸入和輸出(在偵測來自上一個組建的新產生的原始程式檔之後),則會中斷建置循環,因為輸入和輸出檢查指出所有專案都 up-to-date。

編輯器圖示

即使 Live Unit Testing 似乎根據 [輸出] 視窗中的訊息執行測試,我為何在編輯器中看不到任何圖示?

如果 Live Unit Testing 運作的元件因任何原因未檢測,您可能不會在編輯器中看到圖示。 例如,Live Unit Testing 與設定 <UseHostCompilerIfAvailable>false</UseHostCompilerIfAvailable>的專案不相容。 在此情況下,您的建置程式必須更新,才能移除此設定,或將它變更為 true,讓 Live Unit Testing 能夠運作。 

擷取

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

您可以執行數件事來收集更詳細的記錄:

  • 移至 Tools>Options>Live Unit Testing,並將記錄選項變更為 Verbose。 詳細資訊記錄會導致 輸出 視窗中顯示更詳細的記錄。

  • LiveUnitTesting_BuildLog 用戶環境變數設定為您想要用來擷取 MSBuild 記錄檔的檔名。 然後,您可以從該檔案擷取 Live Unit Testing 組建的詳細 MSBuild 記錄訊息。

  • LiveUnitTesting_TestPlatformLog 用戶環境變數設定為 1,以擷取測試平台記錄。 然後,您可以從 [Solution Root]\.vs\[Solution Name]\log\[VisualStudio Process ID]擷取 Live Unit Testing 執行的詳細測試平台記錄訊息。

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

工作區資料夾

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

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

開發磁碟驅動器

即時單元測試是否支持預設工作區根目錄的開發磁碟驅動器?

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

fsutil devdrv setfiltersallowed PrjFlt,WdFilter

另請參閱