从 MSTestV1 升级到 MSTestV2

可以通过将 .csproj 中引用的 MSTest 版本从 MSTestV1 重定目标到 MSTestV2 来升级测试项目。 MSTestV1 中的所有功能都没有引入 MSTestV2,因此可能需要进行一些更改才能解决错误。 请参阅 MSTestV2 不支持的 MSTestV1 功能,了解哪些功能不再起作用。 其中一些功能可能需要从测试中删除。

  1. 从单元测试项目中删除对 Microsoft.VisualStudio.QualityTools.UnitTestFramework 的程序集引用。

  2. 将 NuGet 包引用添加到 MSTestV2,包括 MSTest.TestFramework,以及 nuget.org 上的 MSTest.TestAdapter 包。可以使用以下命令在 NuGet 包管理器控制台中安装包:

    PM> Install-Package MSTest.TestAdapter -Version 3.1.1
    PM> Install-Package MSTest.TestFramework -Version 3.1.1
    

旧式 csproj 示例

示例 .csproj 面向 MSTestV1:

<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <Private>False</Private>
</Reference>

示例 .csproj 现在面向 MSTestV2:

<Reference Include="Microsoft.VisualStudio.TestPlatform.TestFramework, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
  <HintPath>..\packages\MSTest.TestFramework.2.1.2\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll</HintPath>
</Reference>

说明

编码的 UI 测试或 Web 负载测试的测试项目与 MSTestV2 不兼容。 这些项目类型已弃用。 详细了解编码 UI 测试弃用Web 负载测试弃用

SDK 样式 csproj (.NET Core 和 .NET 5 或更高版本)

如果 .csproj 是较新的 SDK 样式 .csproj ,则你很可能已在使用 MSTestV2。 可以在 NuGet 上找到 MSTestV2MSTestV2 适配器 的 NuGet 包。

例:

<ItemGroup>
  <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
  <PackageReference Include="MSTest.TestAdapter" Version="3.1.1" />
  <PackageReference Include="MSTest.TestFramework" Version="3.1.1" />
</ItemGroup>

为什么升级到 MSTestV2?

2016 年,我们发布了使用 MSTestV2 改进 MSTest 框架的下一步。 可以在公告 博客文章中阅读有关此更改的详细信息。

  • MSTestV2 更易于获取和更新,因为它作为 NuGet 包提供。

  • MSTestV2 是开源的

  • 统一的应用平台支持 – MSTestV2 是一种聚合实现,可跨 .NET Framework、.NET Core、ASP.NET Core 和 UWP 提供统一的应用平台支持。 阅读更多

  • 实现完全跨平台(Windows、Linux、Mac)。 阅读更多

  • MSTestV2 支持面向 .NET Framework 4.5.0 及更高版本、.NET Core 1.0 及更高版本(通用 Windows 应用 10+)、ASP.NET Core 1.0 及更高版本,以及 .NET 5 及更高版本。

  • 提供统一的单个最终用户扩展性机制。 阅读更多

  • 为所有基于 MSTest 的测试项目提供统一 DataRow 支持。 阅读更多

  • 允许将 TestCategory 属性放在类或程序集的级别上。 阅读更多

  • 现在,从派生的测试类发现并运行来自另一个程序集中定义的基类的测试方法。 此更改使派生的测试类类型具有一致的行为。 如果出于兼容性原因不需要此行为,可以使用以下运行设置将其更改回去:

    <RunSettings>    
    <MSTest> 
      <EnableBaseClassTestMethodsFromOtherAssemblies>false</EnableBaseClassTestMethodsFromOtherAssemblies> 
    </MSTest> 
    </RunSettings>
    
  • 通过在 程序集内并行执行 测试,实现对并行执行的更精细控制。 此功能允许在程序集内并行运行测试。

  • 即使相应的 TestInitialize 方法失败,也会调用 TestClass 上的 TestCleanup 方法。 问题详细信息

  • AssemblyInitializeClassInitialize 所花费的时间不计入测试持续时间。 此更改限制了其对测试超时的影响。

  • 无法运行的测试可配置为通过 MapNotRunnableToFailed 标记(.runsettings 文件中适配器节点的一部分)标记为失败。

    <RunSettings>    
    <MSTest> 
      <MapNotRunnableToFailed>true</MapNotRunnableToFailed> 
    </MSTest> 
    </RunSettings>
    

MSTestV2 中不支持的 MSTestV1 功能

  • 测试不能包含在“顺序测试”中。
  • .testsettings 文件的更改:
    • 不能再用于配置适配器。
    • 不再支持 <LegacySettings> 部分,这意味着不能使用它来设置属性。 例如,DeploymentItem。 使用新的 .runsettings 文件 进行测试运行配置。
  • 适配器不支持指定为 .vsmdi 文件的测试列表。
  • 不支持“编码的 UI 测试项目”和“Web 性能和负载测试项目”类型。 详细了解编码 UI 测试弃用Web 负载测试弃用
  • 不支持与 TFS 中的测试用例项关联。