配置 MSTest

MSTest 又称 Microsoft Testing Framework,是适用于 .NET 应用程序的测试框架。 该测试框架允许编写和执行测试,并提供与 Visual Studio 和 Visual Studio Code 测试资源管理器、.NET CLI 和许多 CI 管道集成的测试套件。

MSTest 是一个完全受支持的开放源代码和跨平台测试框架,适用于 GitHub 上托管的所有支持的 .NET 目标(.NET Framework、.NET Core、.NET、UWP、WinUI 等)。

Runsettings(运行设置)

.runsettings 文件可用于配置单元测试的运行方式。 若要详细了解与平台相关的 runsettings 和配置,可以查看 VSTest runsettings 文档 或 MSTest 运行程序 runsettings 文档。

并行化设置

若要启用 MSTest 程序集内并行化,请按照下一节中的表所述,配置 MSTest 下的 Parallelize 条目,包括其 Workers 和 Scope 值。 若要强制关闭运行并行化,请设置 <RunConfiguration><DisableParallelization>true</DisableParallelization></RunConfiguration>。 该 DisableParallelization 设置将替代属性 [assembly: Parallelize] 。

有关并行化属性的行为以及每个配置机制的比较,请参阅 “配置并行化”。

MSTest 元素

以下 runsettings 条目允许您配置 MSTest 的行为方式。

配置 默认 价值观
AssemblyCleanupTimeout 没有 全局指定要应用于程序集清理方法的每个实例的超时。 [Timeout] 程序集清理方法中指定的属性将替代全局超时。
AssemblyInitializeTimeout 没有 全局指定要应用于程序集初始化方法的每个实例的超时。 [Timeout] 程序集初始化方法中指定的属性将替代全局超时。
AssemblyResolution false 查找和执行单元测试时,可以指定其他程序集路径。 例如,对与测试程序集位于不同目录中的依赖程序集使用这些路径。 若要指定路径,请使用“Directory Path”元素。 路径可以包括环境变量。

<AssemblyResolution> <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/> </AssemblyResolution>

仅当使用 .NET Framework 目标时才应用此功能。
CaptureTraceOutput Result 从 Console.Write* 和 Trace.Write* API 中捕获文本,并将其关联到当前测试。 在 .NET Framework 上,捕获的内容还包括通过共享跟踪侦听器获取的 Debug.Write*。 现代 .NET 不会将 Debug.Write* 路由到这些侦听器,因此 MSTest 不会捕获它。 从 MSTest 4.4 预览版开始,使用 None、Result 或 Live。 Live还会在测试运行期间回显Console、Trace和TestContext.Write*输出。 以前的布尔值仍受支持: true 映射到 Result 和 false 映射到 None。
ClassCleanupLifecycle 课程结束 如果希望类清理在程序集结束时发生,请将其设置为 EndOfAssembly。 (从 MSTest v4 开始将不再受支持,因为 EndOfClass 是默认且唯一的 ClassCleanup 行为)
ClassCleanupTimeout 没有 全局指定要应用于类清理方法的每个实例的超时。 类清理方法中指定的 [Timeout] 属性将替代全局超时。
ClassInitializeTimeout 没有 全局指定要应用于类初始化方法的每个实例的超时。 类初始化方法中指定的 [Timeout] 属性将替代全局超时。
ConsiderFixturesAsSpecialTests false 若要在 Visual Studio 和 Visual Studio Code 中将 、、、 显示为单独的条目,并在 和 .trx 日志中显示,请将此值设置为 true。
DeleteDeploymentDirectoryAfterTestRunIsComplete 是 若要在测试运行后保留部署目录,请将此值设置为 false。
DeploymentEnabled 是 如果将此值设置为 false,则不会将在测试方法中指定的部署项目复制到部署目录中。
DeployTestSourceDependencies 是 一个值,指示是否要部署测试源引用。
EnableBaseClassTestMethodsFromOtherAssemblies 是 一个值,指示是否启用从与继承测试类不同的程序集中的基类发现测试方法。
ForcedLegacyMode false 较旧版本的 Visual Studio 对 MSTest 适配器进行了优化,使其变得更快且更具伸缩性。 某些行为(如测试的运行顺序)可能不与 Visual Studio 早期版本中的完全一致。 将此值设置为 true 可使用旧测试适配器。

例如,如果为单元测试指定 app.config 文件,可能会用到此设置。

我们建议你考虑重构测试以便可以使用较新的适配器。
GlobalTestCleanupTimeout TestCleanupTimeout 从 MSTest 4.4 开始,为每个全局测试清理方法指定超时。 省略此条目时,MSTest 使用 TestCleanupTimeout。 方法上的一个 [Timeout] 属性会覆盖这两个值。
GlobalTestInitializeTimeout TestInitializeTimeout 从 MSTest 4.4 开始,为每个全局测试初始化方法指定超时。 省略此条目时,MSTest 使用 TestInitializeTimeout。 方法上的一个 [Timeout] 属性会覆盖这两个值。
LaunchDebuggerOnTestFailure false 从 MSTest 4.2 开始,设置为 true 时,MSTest 会在测试失败时启动调试器。
MapInconclusiveToFailed false 如果测试完成返回无结论的状态,则会映射到“测试资源管理器”中的已跳过状态。 如果希望无结论的测试显示为失败,请将此值设为 true。
MapNotRunnableToFailed 是 一个值,指示不可运行的结果是否会映射到失败的测试。
OrderTestsByNameInClass false 如果要在测试资源管理器和命令行中按测试名称运行测试,请将此值设置为 true。
Parallelize 用于设置并行设置:

Workers:用于并行化的线程/辅助角色数,默认情况下是 当前计算机上的处理器数。

Scope:并行化的范围。 你可以将其设置为 MethodLevel。 该名称默认为 ClassLevel。

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
RandomizeTestOrder false 从 MSTest 4.3 开始,将此值设置为 true 以随机顺序运行测试,这有助于显示测试之间的隐藏排序依赖关系。 此设置不能与 OrderTestsByNameInClass 结合使用。
RandomTestOrderSeed 从 MSTest 4.3 开始,当 RandomizeTestOrder 为 true 时,将其设置为整数种子值,以使随机顺序在多次运行之间可复现。 未设置时,每次运行都会使用一个新的种子。
SettingsFile 你可以指定测试设置文件以便与此处的 MSTest 适配器配合使用。 还可以从设置菜单指定测试设置文件。

如果指定此值,则还必须将该值设置为 ForcedLegacyModetrue。

<ForcedLegacyMode>true</ForcedLegacyMode>
TestCleanupTimeout 没有 全局指定要应用于测试清理方法的每个实例的超时。 测试清理方法中指定的 [Timeout] 属性将替代全局超时。
TestInitializeTimeout 没有 全局指定要应用于测试初始化方法的每个实例的超时。 测试初始化方法中指定的 [Timeout] 属性将替代全局超时。
TestTimeout 没有 获取指定的全局测试用例超时。
TreatClassAndAssemblyCleanupWarningsAsErrors false 若要将类清理失败视为错误,请将此值设置为 true。
TreatDiscoveryWarningsAsErrors false 若要将测试发现警告报告为错误,请将此值设置为 true。

超时值必须是正整数(以毫秒为单位)。 若要在不超时的情况下运行,请省略条目,而不是将其设置为 0。 全局测试装置超时继承相应的 TestInitializeTimeout 或 TestCleanupTimeout 值。

TestRunParameter 元素

<TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
</TestRunParameters>

测试运行参数提供了一种方法来定义运行时测试可用的变量和值。 使用 MSTest TestContext.Properties 属性访问参数:

private string _appUrl;
public TestContext TestContext { get; set; }

[TestMethod]
public void HomePageTest()
{
    string _appUrl = TestContext.Properties["webAppUrl"];
}

若要使用测试运行参数,请将公共 TestContext 属性添加到测试类。

.runsettings 文件示例

以下 XML 显示典型 .runsettings 文件的内容。 复制此代码并对其进行编辑以满足需求。

文件的每个元素都是可选的,因为它有默认值。

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>

  <!-- Parameters used by tests at runtime -->
  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

  <!-- MSTest -->
  <MSTest>
    <MapInconclusiveToFailed>True</MapInconclusiveToFailed>
    <CaptureTraceOutput>false</CaptureTraceOutput>
    <DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
    <DeploymentEnabled>False</DeploymentEnabled>
    <ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
    <AssemblyResolution>
      <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/>
    </AssemblyResolution>
  </MSTest>

</RunSettings>

testconfig.json

使用 MSTest 运行测试时,可以使用 testconfig.json 文件来配置测试运行程序的行为。 testconfig.json 文件是一个 JSON 文件,其中包含测试运行程序的配置设置。 该文件用于配置测试运行程序和测试执行环境。 有关详细信息,请参阅 MTP testconfig.json 文档。

从 MSTest 3.7 开始,还可以在同一配置文件中配置 MSTest 运行。 以下部分介绍可在 testconfig.json 文件中使用的设置。

从 MSTest 4.3.3 开始,.NET Framework 运行也接受 testconfig.json 中的注释和尾随逗号。

MSTest 元素

MSTest 设置按以下各节中所述的功能进行分组。

项 默认 描述
enableBaseClassTestMethodsFromOtherAssemblies 是 一个值,指示是否启用从与继承测试类不同的程序集中的基类发现测试方法。
classCleanupLifecycle EndOfAssembly 如果希望类清理在类结束时发生,请将其设置为 EndOfClass。

assemblyResolution 设置

本节中的所有设置都属于 assemblyResolution 元素。

项 默认 描述
路径 没有 查找和执行单元测试时,可以指定其他程序集路径。 例如,对与测试程序集位于不同目录中的依赖程序集使用这些路径。 可以在形状 { "path": "...", "includeSubDirectories": "true/false" }中指定路径。

示例:

{
  "mstest": {
    "assemblyResolution": {
        { "path": "...", "includeSubDirectories": "true/false" }
    }
  }
}

deployment 设置

本节中的所有设置都属于 deployment 元素。

项 默认 描述
测试运行完成后删除部署目录 是 若要在测试运行后保留部署目录,请将此值设置为 false。
部署测试源依赖项 (deployTestSourceDependencies) 是 指示是否要部署测试源引用。
已启用 是 如果将此值设置为 false,则不会将在测试方法中指定的部署项目复制到部署目录中。

示例:

{
  "mstest": {
    "deployment": {
        "deleteDeploymentDirectoryAfterTestRunIsComplete": true,
        "deployTestSourceDependencies": true,
        "enabled": true
    }
  }
}

output 设置

本节中的所有设置都属于 output 元素。

项 默认 描述
captureTrace Result 捕获 Console 和 Trace 输出并将其与当前测试相关联。 在 .NET Framework 上,捕获的内容还包括通过共享跟踪侦听器获取的 Debug 输出。 现代 .NET Debug.Write* 输出未被捕获。 从 MSTest 4.4 预览版开始,使用 None、Result 或 Live。 Live 还可以在测试运行时回显输出(包括 TestContext.Write* 消息)。 布尔值仍受支持: 映射到 ,且 映射到 。

示例:

{
  "mstest": {
    "output": {
        "captureTrace": false
    }
  }
}

parallelism 设置

本节中的所有设置都属于 parallelism 元素。

有关并行化属性的行为以及每个配置机制的比较,请参阅 “配置并行化”。

项 默认 描述
已启用 false 启用测试并行化。
作用域 类 并行化的范围。 你可以将其设置为 method。 默认值 class对应于按顺序运行给定类的所有测试,但并行运行多个类。
工人 0 要用于并行处理的线程/工作者数。 默认值映射到当前计算机上的处理器数。

示例:

{
  "mstest": {
    "parallelism": {
        "enabled": true,
        "scope": "method",
        "workers": 32
    }
  }
}

execution 设置

本节中的所有设置都属于 execution 元素。

项 默认 描述
将空数据源视为不确定 false 设置为 true时,空数据源被视为不确定的。
将Fixtures视为特殊测试 false 若要在 Visual Studio 和 Visual Studio Code AssemblyInitialize 中将 AssemblyCleanup、ClassInitialize、ClassCleanup、Test Explorer 显示为各个单独条目,并在 .trx 日志中记录,请将此值设置为 true。
依赖关系 从 MSTest 4.4 开始,声明测试依赖项 chains 和 nodes。 此设置仅适用于Microsoft。Testing.Platform。 有关详细信息,请参阅 测试依赖项。
mapInconclusiveToFailed false 如果测试完成返回无结论的状态,则会映射到“测试资源管理器”中的已跳过状态。 如果希望无结论的测试显示为失败,请将此值设为 true。
测试失败时启动调试器 false 从 MSTest 4.2 开始,当其设置为 true 时,MSTest 会在测试失败时启动调试器。
mapNotRunnableToFailed 是 一个值,指示不可运行的结果是否会映射到失败的测试。
将测试按类内名称排序 false 在每个类中按字母顺序运行测试。 从 MSTest 4.3 开始,请使用 mstest.execution.orderTestsByNameInClass。 前面的 mstest.orderTestsByNameInClass 密钥仍然有效,但会生成弃用警告。
随机化测试顺序 false 从 MSTest 4.3 开始,将此值设置为 true 以随机顺序运行测试,这有助于显示测试之间的隐藏排序依赖关系。 此设置不能与 orderTestsByNameInClass 结合使用。
randomTestOrderSeed 从 MSTest 4.3 开始,当 randomizeTestOrder 为 true 时,设置一个整数种子,以使随机顺序在多次运行之间可复现。 未设置时,每次运行都会使用一个新的种子。
将类和程序集清理警告视为错误 false 若要将类清理失败视为错误,请将此值设置为 true。
将发现警告视为错误 false 若要将测试发现警告报告为错误,请将此值设置为 true。

示例:

{
  "mstest": {
    "execution": {
        "considerEmptyDataSourceAsInconclusive": false,
        "considerFixturesAsSpecialTests": false,
        "mapInconclusiveToFailed": true,
        "mapNotRunnableToFailed": true,
        "treatClassAndAssemblyCleanupWarningsAsErrors": false,
        "treatDiscoveryWarningsAsErrors": false
    }
  }
}

timeout 设置

本节中的所有设置都属于 timeout 元素。

项 默认 描述
assemblyCleanup 没有 全局指定要应用于程序集清理方法的每个实例的超时。
assemblyInitialize 没有 全局指定要应用于程序集初始化方法的每个实例的超时。
classCleanup 没有 全局指定要应用于类清理方法的每个实例的超时。
classInitialize 没有 全局指定要应用于类初始化方法的每个实例的超时。
globalTestCleanup testCleanup 从 MSTest 4.4 开始,为每个全局测试清理方法指定超时。 省略此条目时,MSTest 使用 testCleanup。
globalTestInitialize testInitialize 从 MSTest 4.4 开始,为每个全局测试初始化方法指定超时。 省略此条目时,MSTest 使用 testInitialize。
测试 没有 全局指定测试超时。
testCleanup 没有 全局指定要应用于测试清理方法的每个实例的超时。
testInitialize 没有 全局指定要应用于测试初始化方法的每个实例的超时。
useCooperativeCancellation false 当设置为 true, 如果超时,MSTest 只会触发取消 CancellationToken,但不会停止观察该方法。 此行为性能较好,但依赖于用户正确让令牌经过所有路径。

注意

超时值必须是正整数(以毫秒为单位)。 若要在不超时的情况下运行,请省略条目,而不是将其设置为 0。 全局测试装置超时继承相应的 testInitialize 或 testCleanup 值,因此,当不希望全局固定装置出现超时时,请省略这两个条目。 方法上的 [Timeout] 特性会覆盖已配置的超时时间。

示例:

{
  "mstest": {
    "timeout": { "globalTestInitialize": 30000, "globalTestCleanup": 30000 }
  }
}

示例 testconfig.json 文件

以下 JSON 显示了典型 .testconfig.json 文件的内容。 复制此代码并对其进行编辑以满足需求。

文件的每个元素都是可选的,因为它有默认值。

{
  "platformOptions": {
    "resultDirectory": "./TestResults"
  },
  "mstest": {
    "execution": {
        "mapInconclusiveToFailed": true,
        "disableAppDomain": true,
        "considerFixturesAsSpecialTests": false
    },
    "parallelism": {
        "enabled": true,
        "scope": "method"
    },
    "output": {
        "captureTrace": false
    }
  }
}

MSBuild 属性

从 MSTest 4.3 开始,无需编写 Directory.Build.props 特性,即可通过项目文件或 [assembly: Parallelize] 选择启用程序集级并行执行。 这些属性在生成过程中发出相应的程序集属性,因此它们必须是 GenerateAssemblyInfotrue (SDK 样式项目的默认值)。

有关生成的属性的行为以及每个配置机制的比较,请参阅 “配置并行化”。

财产 默认 描述
MSTestParallelizeScope 并行化范围。 将其设置为 MethodLevel 或 ClassLevel 以输出 [assembly: Parallelize(Scope = ExecutionScope.MethodLevel)](或 ExecutionScope.ClassLevel),或将其设置为 None 以输出 [assembly: DoNotParallelize]。
MSTestParallelizeWorkers 最大工作线程数,作为 Workers 的 [assembly: Parallelize] 值发出。 值为 0 时,映射到当前计算机上的处理器数量。 当 MSTestParallelizeScope 为 None 时,无法设置此属性。

MSTest 在生成过程中验证这两个属性。 无效的作用域值、非整数的工作线程计数,以及与 None 作用域组合使用的工作线程计数都会导致构建失败。 也不要在源文本中声明 [assembly: Parallelize] 或 [assembly: DoNotParallelize],因为生成的属性会重复包含它们。 如果 GenerateAssemblyInfo 为 false,请改为在源中声明属性。

以下示例为每个导入 Directory.Build.props 文件的测试项目启用方法级并行化,并设置四个工作线程:

<Project>
  <PropertyGroup>
    <MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
    <MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
  </PropertyGroup>
</Project>