Live Unit Testing 常见问题解答

支持的框架

Live Unit Testing 支持哪些测试框架和最低版本?

Live Unit Testing 适用于下表中列出的三个常用的单元测试框架。 表中还列出了其适配器和框架支持的最低版本。 单元测试框架都可从 NuGet.org 获得。

测试框架 Visual Studio 适配器最低版本 Framework 最低版本
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-预览版 MSTest.TestFramework 1.0.5-预览版

如果你有引用 Microsoft.VisualStudio.QualityTools.UnitTestFramework 的测试项目(该项目是基于较旧的 MSTest),并且不想移动到较新的 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 出现生成问题。

  • 如果工作区根目录属性过长,则生成可能会由于指示路径过长的异常而失败。

  • 如果存储库根目录属性不指向存储库根目录,则工作区将会填入错误的文件集。

  • 对于 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)的引用。 有关详细信息,请参阅支持的测试框架

  • 解决方案中至少一个项目应有针对 xUnit、NUnit 或 MSTest 测试框架的 NuGet 引用或直接引用。 此项目还应引用相应的 Visual Studio 测试适配器 NuGet 包。 还可以通过 .runsettings 文件引用 Visual Studio 测试适配器 。 .runsettings 文件必须包含如下示例所示的条目 :

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

为什么我的测试无法运行?

  • 一个常见问题是,并非所有文件都复制到测试文件夹。 可能需要向 csproj 文件添加一些 Live Unit Testing 测试依赖项项目

  • 另一个问题是超时。 由于 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 按顺序运行每个测试程序集中的测试。 在“测试资源管理器”中,可以选择并行运行多个测试 。

  • 测试资源管理器默认以单线程单元 (STA) 运行测试,而 Live Unit Testing 以多线程单元 (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 可以正常运行。 

捕获日志

如何收集更详细的日志到文件 Bug 报告?

可以执行以下几个操作来收集更详细的日志:

  • 转到“工具”>“选项”>“Live Unit Testing”,将日志记录选项更改为“详细” 。 详细日志记录会使“输出”窗口显示更详细的日志 。

  • 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 的“输出”–“测试” 选项卡中看到大量日志记录。

Workspace 文件夹

是否可以编辑工作区文件夹下的文件?

否,不应打开或编辑工作区文件夹的生成和测试目录下的文件。 Live Unit Testing 应管理 src 文件夹中的所有文件,使其在存储库根目录工作区根目录之间保持同步

开发驱动器

实时单元测试是否支持默认工作区根目录的开发驱动器?

是的,但需要确保它已启用。 如果使用开发驱动器,请确保已启用 投影文件系统 (ProjFS) 筛选器。 例如,以下命令会启用 ProjFS 并Windows Defender:

fsutil devdrv setfiltersallowed PrjFlt, WdFilter