配置 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 元素

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

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

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

仅当使用 .NET Framework 目标时才应用此功能。
CaptureTraceOutput 捕获来自 Console.Write*Trace.Write*Debug.Write* API 的文本消息,这些 API 将与当前正在运行的测试相关联。
ClassCleanupLifecycle EndOfClass 如果希望在程序集结束时进行类清理,请将此项设置为 EndOfAssembly。 (从 MSTest v4 开始不再支持,因为 EndOfClass 是默认的且唯一的 ClassCleanup 行为)
ClassCleanupTimeout 0 全局指定要应用于类清理方法的每个实例的超时。 类清理方法中指定的 [Timeout] 属性将替代全局超时。
ClassInitializeTimeout 0 全局指定要应用于类初始化方法的每个实例的超时。 类初始化方法中指定的 [Timeout] 属性将替代全局超时。
ConsiderFixturesAsSpecialTests false 若要在 Visual Studio 和 Visual Studio Code AssemblyInitializeAssemblyCleanup 日志中将 ClassInitializeClassCleanupTest Explorer 显示为单独的条目,请将此值设置为 true
DeleteDeploymentDirectoryAfterTestRunIsComplete 若要在测试运行后保留部署目录,请将此值设置为 false。
DeploymentEnabled 如果将此值设置为 false,则不会将在测试方法中指定的部署项目复制到部署目录中
DeployTestSourceDependencies 一个值,指示是否要部署测试源引用。
EnableBaseClassTestMethodsFromOtherAssemblies 一个值,指示是否启用从与继承测试类不同的程序集中的基类发现测试方法。
ForcedLegacyMode false 较旧版本的 Visual Studio 对 MSTest 适配器进行了优化,使其变得更快且更具伸缩性。 某些行为(如测试的运行顺序)可能不与 Visual Studio 早期版本中的完全一致。 将此值设置为 true 可使用旧测试适配器。

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

我们建议你考虑重构测试以便可以使用较新的适配器。
MapInconclusiveToFailed false 如果测试完成返回无结论的状态,则会映射到“测试资源管理器”中的已跳过状态。 如果希望无结论的测试显示为失败,请将此值设为 true。
MapNotRunnableToFailed 一个值,指示不可运行的结果是否会映射到失败的测试。
按类内名称排序测试 false 如果要在测试资源管理器和命令行中按测试名称运行测试,请将此值设置为 true
Parallelize 用于设置并行设置:

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

范围:并行化的范围。 可以将其设置为 MethodLevel。 默认情况下,它是 ClassLevel。

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
SettingsFile 你可以指定测试设置文件以便与此处的 MSTest 适配器配合使用。 还可以从设置菜单指定测试设置文件。

如果指定此值,则还必须将“ForcedLegacyMode”设置为“true”。

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

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 run time -->
  <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 文件,其中包含测试运行程序的配置设置。 该文件用于配置测试运行程序和测试执行环境。 有关详细信息,请参阅 Microsoft.Testing.Platform testconfig.json 文档

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

MSTest 元素

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

默认 描述
orderTestsByNameInClass false 如果要在测试资源管理器和命令行中按测试名称运行测试,请将此值设置为 true
enableBaseClassTestMethodsFromOtherAssemblies 一个值,指示是否启用从与继承测试类不同的程序集中的基类发现测试方法。
classCleanupLifecycle EndOfAssembly 如果希望类清理在类结束时发生,请将其设置为 EndOfClass

AssemblyResolution 设置

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

部署设置

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

输出设置

默认 描述
captureTrace false 捕获来自 Console.Write*Trace.Write*Debug.Write* API 的文本消息,这些 API 将与当前正在运行的测试相关联。

并行度设置

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

Execution 设置

默认 描述
considerEmptyDataSourceAsInconclusive false 设置为 true时,空数据源被视为不确定的。
considerFixturesAsSpecialTests false 若要在 Visual Studio 和 Visual Studio Code Test Explorer 中将 AssemblyInitializeAssemblyCleanupClassInitializeClassCleanup 显示为各个单独条目,并在 .trx 日志中记录,请将此值设置为 true
mapInconclusiveToFailed false 如果测试完成返回无结论的状态,则会映射到“测试资源管理器”中的已跳过状态。 如果希望无结论的测试显示为失败,请将此值设为 true。
mapNotRunnableToFailed 一个值,指示不可运行的结果是否会映射到失败的测试。
treatClassAndAssemblyCleanupWarningsAsErrors false 若要将类清理失败视为错误,请将此值设置为 true。
treatDiscoveryWarningsAsErrors false 若要将测试发现警告报告为错误,请将此值设置为 true。

超时设置

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

注意

[Timeout] 方法上指定的属性会覆盖全局超时。 例如, [Timeout(1000)] 在标有 [AssemblyCleanup] 的方法上将覆盖全局 assemblyCleanup 暂停。

示例 testconfig.json 文件

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

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

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