欢迎使用我们的新测试平台! 为了帮助你熟悉其功能,我们将从演示如何注册和运行测试的简单示例开始。 此基础示例将让你深入了解核心功能以及如何快速入门。
注释
本文中的所有概念在 Microsoft Test Framework 存储库中作为完整示例进行演示。 有关详细信息,请参阅 示例代码。
在此初始示例中,你将演练声明和运行测试应用程序的基本步骤。 这种简单的方法可确保您仅需最少的设置即可立即开始使用该平台。
了解如何创建您的第一个测试应用程序后,您可以探索一个扩展实例,部分涵盖围绕测试应用程序扩展的相关概念。
熟悉基础知识后,可以深入探讨各种扩展点。 这将包括:
平台和测试框架功能:了解平台和测试框架提供的全部功能,使你能够有效地利用这些功能。
自定义测试框架:如何编写和注册自定义测试框架,使你能够根据特定要求定制测试环境。
In-Process 和进程外扩展:有关如何编写和注册进程内扩展和进程外扩展的详细说明,提供扩展平台的灵活性。
执行顺序:阐明各种扩展点的执行顺序,以确保自定义扩展的无缝集成和作。
最后,查看平台中可用服务和帮助程序函数的详尽列表。 本部分将作为参考,帮助你利用你掌握的所有工具来创建可靠且高效的测试扩展。
通过遵循此结构化方法,你将全面了解我们的测试平台,从基本用法到高级自定义。 让我们开始探索我们的平台可以提供的功能的全部潜力!
步骤 1:注册并运行简单的测试应用程序
为了介绍测试平台的体系结构,本文档将使用经典控制台应用程序(for Windows)作为主机。 本文档中的示例以 C# 编写,但可以将测试平台与支持 .NET Ecma 规范的任何语言一起使用,并在 .NET 支持的任何 OS 上运行。 若要使用平台,只需引用 Microsoft.Testing.Platform.dll
程序集,即可通过 https://www.nuget.org/packages/Microsoft.Testing.Platform 上提供的官方 NuGet 包来使用。
在控制台项目中 Contoso.UnitTests.exe
,以下 Main
方法定义入口点:
public static async Task<int> Main(string[] args)
{
ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
builder.RegisterTestFramework();
using ITestApplication testApp = await builder.BuildAsync();
return await testApp.RunAsync();
}
此代码包括执行测试会话所需的所有内容,但不包括通过 RegisterTestFramework
注册一个测试框架(例如 MSTest)。 此代码将在后面的部分中显示和说明。
注释
默认行为是让测试平台 MSBuild 任务自动生成入口点。 为此,请将 Microsoft.Testing.Platform.MSBuild
包添加到项目。
启动应用程序时 Contoso.UnitTests.exe
,将创建标准 Windows 进程,并且测试平台与已注册的测试框架交互以执行测试会话。
创建一个过程来执行此工作:
测试平台包括一个内置显示设备,用于在终端中写入测试会话信息,如下所示:
Microsoft(R) Testing Platform Execution Command Line Tool
Version: 1.1.0+8c0a8fd8e (UTC 2024/04/03)
RuntimeInformation: win-x64 - .NET 9.0.0-preview.1.24080.9
Copyright(c) Microsoft Corporation. All rights reserved.
Passed! - Failed: 0, Passed: 1, Skipped: 0, Total: 1, Duration: 5ms - Contoso.UnitTests.dll (win-x64 - .NET 9.0.0-preview.1.24080.9)
注释
调用ITestApplication.RunAsync()
返回的已知退出代码在平台退出代码中有详细介绍。
步骤 2:扩展平台
测试运行通常收集代码覆盖率信息或类似信息来评估代码质量。 在测试主机进程启动之前,此类工作负荷可能需要配置,例如设置环境变量。
测试平台通过具有 进程外 扩展来适应这一点。 使用进程外扩展运行时,测试平台将启动多个进程,并相应地管理它们。
以下示例演示如何使用 TestHostController 扩展注册代码覆盖率功能。
ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
builder.RegisterTestFramework();
builder.AddCodeCoverage();
using ITestApplication testApp = await builder.BuildAsync();
return await testApp.RunAsync();
builder.AddCodeCoverage();
内部使用 TestHostController
扩展点,这是一种进程外的扩展点。
public static class TestApplicationBuilderExtensions
{
public static ITestApplicationBuilder AddCodeCoverage(
this ITestApplicationBuilder builder)
{
builder.TestHostControllers
.AddEnvironmentVariableProvider(/* ... */);
// ...
return builder;
}
}
稍后部分将介绍 API AddEnvironmentVariableProvider
的参数。
这次运行 Contoso.UnitTests.exe
时,测试平台检测到已注册 TestHostController
扩展。 因此,它将进程的另一个实例 Contoso.UnitTests.exe
作为子进程启动。 这样做是为了正确设置环境变量,以符合注册到 API 的 AddEnvironmentVariableProvider
扩展的要求。
进程布局如下所示:
注释
提供的示例假定控制台应用程序布局,它正确处理启动过程,并将所有命令行参数传播到子进程。 如果使用其他主机,则需要确保入口点代码正确地将进程入口点(“Main”)转发到相应的代码块。 运行时只需使用相同的命令行参数来启动自身。
以上部分简要介绍了测试平台的体系结构。 当前扩展点分为两类:
可通过测试应用程序生成器的属性访问
TestHost
。 进程中意味着它们将在与测试框架相同的进程中运行。ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args); builder.RegisterTestFramework(); builder.TestHost.AddXXX(/* ... */);
如前所述,最重要的扩展点是进程内 测试框架 (
RegisterTestFramework
),这是唯一 必需的 框架。可以通过测试应用程序生成器的属性访问
TestHostControllers
扩展。 这些扩展在测试框架的单独进程中运行,以“观察”它。ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args); builder.TestHostControllers.AddXXX(/* ... */);
步骤 3:扩展点的综合概述
步骤 4:可用服务
测试平台为测试框架和扩展点提供有价值的服务。 这些服务满足常见需求,例如访问配置、分析和检索命令行参数、获取日志记录工厂以及访问日志记录系统等。
IServiceProvider
为测试平台实现 服务定位器模式 。
Microsoft.Testing.Platform Services 文档中列出了有关如何访问和使用这些服务的所有服务、帮助程序和技术信息。