MSTest v3 迁移指南

本指南可帮助用户将 MSTest 项目从 MSTest v1 升级到 MSTest v3。 MSTest v3 引入了重要的新功能、优化和一些重大更改,以提高测试可靠性、执行速度和与新式 .NET 框架的兼容性。

谁会受到影响?

本指南适用于当前 通过以下任一方法使用 MSTest v1 的项目

  • 程序集引用:直接引用 Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll 的项目。
  • NuGet 包:使用 MSTest.TestFramework 版本 1.0.0-1.4.0 的 NuGet 包的项目。

如果项目依赖于 MSTest 进行单元测试并包含上述参考,它将受益于 MSTest v3 中的改进,并且需要本指南中概述的调整。

为什么迁移到 MSTest v3?

即使对当前的 MSTest 设置感到满意,升级到 MSTest v3 也会带来显著优势,从而提高测试的质量和未来就绪性。 这就是为什么现在进行切换可能是一个有价值的步骤:

  • 增强的安全性:MSTest v1 具有已知的安全漏洞。 使用 MSTest v3,我们实现了广泛的安全改进,以保护测试环境。

  • 即时性能提升:MSTest v3 可显著减少测试执行时间并优化资源使用情况。 这在 CI/CD 管道中特别有用,其中更快的测试可以缩短部署周期并降低基础结构成本。

  • 测试的未来证明:MSTest v3 为新式 .NET 版本(包括 .NET 8 和将来的迭代)以及跨平台兼容性提供可靠的支持。 这意味着你的测试将更适应并准备升级,从而避免过时测试框架的技术债务。

  • 使用新分析器提高代码可靠性:MSTest v3 内置代码分析器强制实施最佳做法,有助于尽早发现问题并提升更简洁、更易于维护的测试代码:

    • 主动问题检测:分析器提供实时反馈,在编写测试时建议改进和标记潜在问题。

    • 更强的类型安全断言:替换不明确的重载,MSTest v3 强制实施类型安全断言,降低错误测试行为的风险,并使测试更加可靠。

    • 更简洁的代码,减少维护:通过将测试与 MSTest 标准和最佳做法保持一致,MSTest v3 可帮助你维护更清洁、更易于管理的代码库,并随着时间的推移减少技术债务。

  • 更大的灵活性和可扩展性:MSTest v3 支持高级测试方案,包括动态数据源和程序集内并行执行。 这种灵活性可实现更复杂的测试方法,并加快测试套件,而无需复杂的配置。

通过升级,你将设置测试以更快、更可靠且适应未来的 .NET 开发,将项目定位为长期成功和维护更轻松。

迁移步骤

1.删除程序集引用

对于通过程序集引用使用 MSTest v1 的项目,有对以下 DLL 的引用:

  • Microsoft.VisualStudio.QualityTools.UnitTestFramework

在非 SDK 样式项目中,这些引用通常通过 Visual Studio 添加,而不是直接编辑 XML。 若要使用 Visual Studio GUI 删除这些引用,请执行以下操作:

  1. 在 Visual Studio 中打开解决方案资源管理器

  2. 使用 MSTest 展开项目的项目节点

  3. 找到项目中的 “引用 ”文件夹。

  4. “引用” 文件夹中, 找到并选择 MSTest DLL 引用, Microsoft.VisualStudio.QualityTools.UnitTestFramework

  5. 右键单击 所选引用,然后从上下文菜单中选择“ 删除 ”。

    image

  6. 保存项目 以应用更改。

2.更新项目

可以通过以下两种方式之一将项目更新为 MSTest v3:

  • 更新包:如果 NuGet 包引用了 MSTest.TestFrameworkMSTest.TestAdapter,请使用 Visual Studio 中的 NuGet 程序包管理器或在 NuGet 程序包管理器 控制台中运行以下命令更新它们:

    Update-Package MSTest.TestFramework -Version 3.6.2
    Update-Package MSTest.TestAdapter -Version 3.6.2
    
  • 或者安装 MSTest 包:在 Visual Studio 中使用 NuGet 程序包管理器安装最新的 MSTest,或者在 NuGet 程序包管理器 控制台中运行以下命令:

    Install-Package MSTest -Version 3.6.2
    
  • 或直接 更新项目文件(对于 SDK 样式项目):更新 .csproj 文件以指定 MSTest SDK 版本。

    <Project Sdk="MSTest.Sdk/3.6.2">
      <PropertyGroup>
        <TargetFramework>net8.0</TargetFramework>
      </PropertyGroup>
    </Project>
    

选择最适合项目设置的选项。 这两种方法可确保项目升级为使用 MSTest v3。

3.更新代码

  • Assert.AreEqual/AreNotEqual 或 Assert.AreSame/AreNotSame (with object) 如果其中一个断言导致错误,我们建议验证要比较的类型是否兼容。 如果是,请考虑添加显式泛型键入来解决该问题。

  • 使用泛型

    Assert.AreEqual<customObject>(expectedObject, actualObject);
    Assert.AreNotEqual<customObject>(expectedObject, actualObject);
    
  • 测试初始化:使用 TestInitialize 异步初始化的方法。

  • 清理:使用 TestCleanup 方法或 Dispose 模式进行清理。

  • RunSettings.testsettings 不再支持该文件,这意味着 <LegacySettings> 也不再可用。 将 .runsettings 用于测试配置。

MSTest v3 中的新功能

  • 改进了测试项目的默认值
  • 简化的设置和用法
  • MSTest 运行程序增强的扩展性
  • 新的基于 Roslyn 的代码分析器,用于改进测试开发
  • 支持 WinUI 应用程序
  • 程序集内并行执行
  • 数据驱动测试的动态数据源

已弃用的功能

  • 放弃了对:
    • .NET Framework 4.5 (使用 .NET 4.6.2 或更高版本)
    • .NET Standard 1.0 (使用 .NET Standard 2.0)
    • 16299 之前的 UWP 版本
    • 18362 之前的 WinUI 版本
    • .NET 5 (使用 .NET Core 3.1 或 .NET 6)

重大更改和已删除的 API

断言重载

如果 AreEqual、AreNotEqual、AreSame 或 AreNotSame 断言会导致错误,建议检查要比较的类型是否兼容。 如果是,请考虑添加显式泛型键入来解决该问题。

DataRowAttribute 更新

MSTest v3 中的 DataRowAttribute 构造函数已简化,以强制参数类型匹配。 这意味着必须在 DataRow 中指定与方法参数的类型精确匹配的值。

示例:

[TestMethod]
[DataRow(1, "test")] // Correct: matches parameter types (int, string)
public void MyTestMethod(int number, string text) { ... }

如果类型不匹配,MSTest v3 现在将引发错误,而不是尝试转换。

超时设置

在 MSTest v3 中,已标准化设置处理 Timeout ,以确保在不同 .NET 环境中的行为一致。 此更改可能会影响依赖于特定超时值的测试,尤其是在这些测试是异步测试或在不同的框架下运行时。

  • 在 MSTest v1 或 v2 中,某些超时设置可能根据框架(例如 .NET Framework 与 .NET Core)的不同解释。
  • MSTest v3 强制实施一致的超时行为,这可能意味着在旧版本中配置了超时的测试可能会失败或行为不同(如果超时值在新的标准下太短)。

这意味着

  • 具有超时的测试可能需要调整:如果测试具有 Timeout 具有特定持续时间的属性,请验证这些值是否仍允许在 MSTest v3 下完成测试。 以前通过特定超时的测试可能需要更高或更低的超时值才能在新规则下正常工作。

  • 统一超时处理:MSTest v3 统一超时处理使超时更具可预测性,但需要在较旧的测试中检查和可能更新 Timeout 值。

示例:

// Old (v1/v2) - Timeout was sometimes interpreted inconsistently
[TestMethod]
[Timeout(2000)] // Timeout in milliseconds
public void TestMethod() { ... }

// New (v3) - Unified handling of timeout
[TestMethod]
[Timeout(2000)] // Verify this value still works under MSTest v3
public async Task TestMethod() { ... } 

配置更改

确保 .runsettings 文件与 MSTest v3 语法和结构保持一致。

并行执行和性能优化

在 .runsettings配置并行执行以提高性能。

示例:

<RunSettings>
  <RunConfiguration>
    <MaxCpuCount>-1</MaxCpuCount> <!-- Uses all available processors -->
  </RunConfiguration>
</RunSettings>

改进了资源使用情况

MSTest v3 优化资源管理,降低内存使用率,提高 CPU 效率。

处理过时的属性和迁移自定义扩展

查看已弃用的属性,并在可能的情况下将其替换为 MSTest v3 替代项。

代码分析器和最佳做法

MSTest v3 包括用于最佳做法的内置代码分析器、避免配置缺陷以及正确使用 MSTest 属性和设置。 使用 MSTest 包或 MSTest.Sdk 时,系统会自动提供此功能,也可以安装 MSTest 分析器包

其他资源