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 |
课程结束 | 如果希望类清理在程序集结束时发生,请将其设置为 EndOfAssembly。 (从 MSTest v4 开始将不再受支持,因为 EndOfClass 是默认且唯一的 ClassCleanup 行为) |
ClassCleanupTimeout |
0 | 全局指定要应用于类清理方法的每个实例的超时。 类清理方法中指定的 [Timeout] 属性将替代全局超时。 |
ClassInitializeTimeout |
0 | 全局指定要应用于类初始化方法的每个实例的超时。 类初始化方法中指定的 [Timeout] 属性将替代全局超时。 |
ConsiderFixturesAsSpecialTests |
false | 若要在 Visual Studio 和 Visual Studio Code 中将 |
DeleteDeploymentDirectoryAfterTestRunIsComplete |
是 | 若要在测试运行后保留部署目录,请将此值设置为 false。 |
DeploymentEnabled |
是 | 如果将此值设置为 false,则不会将在测试方法中指定的部署项目复制到部署目录中。 |
DeployTestSourceDependencies |
是 | 一个值,指示是否要部署测试源引用。 |
EnableBaseClassTestMethodsFromOtherAssemblies |
是 | 一个值,指示是否启用从与继承测试类不同的程序集中的基类发现测试方法。 |
ForcedLegacyMode |
false | 较旧版本的 Visual Studio 对 MSTest 适配器进行了优化,使其变得更快且更具伸缩性。 某些行为(如测试的运行顺序)可能不与 Visual Studio 早期版本中的完全一致。 将此值设置为 true 可使用旧测试适配器。 例如,如果为单元测试指定 app.config 文件,可能会用到此设置。 我们建议你考虑重构测试以便可以使用较新的适配器。 |
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 |
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 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 元素
MSTest 设置按以下各节中所述的功能进行分组。
| 项 | 默认 | 描述 |
|---|---|---|
| 将测试按类内名称排序 | false | 如果要在测试资源管理器和命令行中按测试名称运行测试,请将此值设置为 true。 |
| 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 | 是 | 捕获来自 Console.Write*、Trace.Write* 和 Debug.Write* API 的文本消息,这些 API 将与当前正在运行的测试相关联。 |
示例:
{
"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。 |
| mapInconclusiveToFailed | false | 如果测试完成返回无结论的状态,则会映射到“测试资源管理器”中的已跳过状态。 如果希望无结论的测试显示为失败,请将此值设为 true。 |
| 测试失败时启动调试器 | false | 从 MSTest 4.2 开始,当其设置为 true 时,MSTest 会在测试失败时启动调试器。 |
| mapNotRunnableToFailed | 是 | 一个值,指示不可运行的结果是否会映射到失败的测试。 |
| 随机化测试顺序 | 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 | 0 | 全局指定要应用于程序集清理方法的每个实例的超时。 |
| assemblyInitialize | 0 | 全局指定要应用于程序集初始化方法的每个实例的超时。 |
| classCleanup | 0 | 全局指定要应用于类清理方法的每个实例的超时。 |
| classInitialize | 0 | 全局指定要应用于类初始化方法的每个实例的超时。 |
| 测试 | 0 | 全局指定测试超时。 |
| testCleanup | 0 | 全局指定要应用于测试清理方法的每个实例的超时。 |
| testInitialize | 0 | 全局指定要应用于测试初始化方法的每个实例的超时。 |
| useCooperativeCancellation | false | 当设置为 true, 如果超时,MSTest 只会触发取消 CancellationToken,但不会停止观察该方法。 此行为性能较好,但依赖于用户正确让令牌经过所有路径。 |
注意
[Timeout] 方法上指定的属性会覆盖全局超时。 例如, [Timeout(1000)] 在标有 [AssemblyCleanup] 的方法上将覆盖全局 assemblyCleanup 暂停。
示例:
{
"mstest": {
"timeout": {
"assemblyCleanup": 0,
"assemblyInitialize": 0,
"classCleanup": 0,
"classInitialize": 0,
"test": 0,
"testCleanup": 0,
"testInitialize": 0,
"useCooperativeCancellation": false
}
}
}
示例 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 开始,无需编写 [assembly: Parallelize] 特性,即可通过项目文件或 Directory.Build.props 选择启用程序集级并行执行。 这些属性在生成过程中发出相应的程序集属性,因此它们必须是 GenerateAssemblyInfotrue (SDK 样式项目的默认值)。
| 财产 | 默认 | 描述 |
|---|---|---|
MSTestParallelizeScope |
并行化范围。 将其设置为 MethodLevel 或 ClassLevel 以输出 [assembly: Parallelize(Scope = ExecutionScope.MethodLevel)](或 ExecutionScope.ClassLevel),或将其设置为 None 以输出 [assembly: DoNotParallelize]。 |
|
MSTestParallelizeWorkers |
最大工作线程数,作为 [assembly: Parallelize] 的 Workers 值发出。 值为 0 时,映射到当前计算机上的处理器数量。 当 MSTestParallelizeScope 为 None 时,无法设置此属性。 |
以下示例为每个导入 Directory.Build.props 文件的测试项目启用方法级并行化,并设置四个工作线程:
<Project>
<PropertyGroup>
<MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
<MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
</PropertyGroup>
</Project>