Microsoft.Testing.Platform 体系结构

欢迎使用我们的新测试平台! 为了帮助你熟悉其功能,我们将从演示如何注册和运行测试的简单示例开始。 此基础示例将让你深入了解核心功能以及如何快速入门。

注释

本文中的所有概念在 Microsoft Test Framework 存储库中作为完整示例进行演示。 有关详细信息,请参阅 示例代码

步骤 1:注册并运行简单的测试应用程序

在此初始示例中,你将演练声明和运行测试应用程序的基本步骤。 这种简单的方法可确保您仅需最少的设置即可立即开始使用该平台。

步骤 2:扩展平台

了解如何创建您的第一个测试应用程序后,您可以探索一个扩展实例,部分涵盖围绕测试应用程序扩展的相关概念。

步骤 3:扩展点的综合概述

熟悉基础知识后,可以深入探讨各种扩展点。 这将包括:

  1. 平台和测试框架功能:了解平台和测试框架提供的全部功能,使你能够有效地利用这些功能。

  2. 自定义测试框架:如何编写和注册自定义测试框架,使你能够根据特定要求定制测试环境。

  3. In-Process 和进程外扩展:有关如何编写和注册进程内扩展和进程外扩展的详细说明,提供扩展平台的灵活性。

  4. 执行顺序:阐明各种扩展点的执行顺序,以确保自定义扩展的无缝集成和作。

步骤 4:可用的服务和帮助程序

最后,查看平台中可用服务和帮助程序函数的详尽列表。 本部分将作为参考,帮助你利用你掌握的所有工具来创建可靠且高效的测试扩展。

通过遵循此结构化方法,你将全面了解我们的测试平台,从基本用法到高级自定义。 让我们开始探索我们的平台可以提供的功能的全部潜力!

步骤 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”)转发到相应的代码块。 运行时只需使用相同的命令行参数来启动自身。

以上部分简要介绍了测试平台的体系结构。 当前扩展点分为两类:

  1. 可通过测试应用程序生成器的属性访问TestHost。 进程中意味着它们将在与测试框架相同的进程中运行。

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.RegisterTestFramework();
    
    builder.TestHost.AddXXX(/* ... */);
    

    如前所述,最重要的扩展点是进程内 测试框架RegisterTestFramework),这是唯一 必需的 框架。

  2. 可以通过测试应用程序生成器的属性访问TestHostControllers扩展。 这些扩展在测试框架的单独进程中运行,以“观察”它。

    ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);
    
    builder.TestHostControllers.AddXXX(/* ... */);
    

步骤 3:扩展点的综合概述

首先,在深入了解各种扩展点之前,先熟悉功能的概念。

步骤 4:可用服务

测试平台为测试框架和扩展点提供有价值的服务。 这些服务满足常见需求,例如访问配置、分析和检索命令行参数、获取日志记录工厂以及访问日志记录系统等。 IServiceProvider 为测试平台实现 服务定位器模式

Microsoft.Testing.Platform Services 文档中列出了有关如何访问和使用这些服务的所有服务、帮助程序和技术信息。