Partilhar via


Arquitetura Microsoft.Testing.Platform

Bem-vindo à nossa nova plataforma de testes! Para ajudá-lo a se familiarizar com seus recursos, começaremos com um exemplo simples que demonstra como registrar e executar um teste. Este exemplo fundamental lhe dará uma sólida compreensão da funcionalidade principal e como começar rapidamente.

Observação

Todos os conceitos neste artigo são exemplificados no repositório do Microsoft Test Framework como um exemplo completo. Para obter mais informações, consulte o código de exemplo .

Etapa 1: Registrar e executar um aplicativo de teste simples

Neste exemplo inicial, você percorre as etapas básicas para declarar e executar um aplicativo de teste. Essa abordagem direta garante que você possa começar imediatamente a usar a plataforma com o mínimo de configuração.

Etapa 2: Estendendo a Plataforma

Depois de descobrir como criar seu primeiro aplicativo de teste, você explora um exemplo de extensão para cobrir parcialmente os conceitos em torno das extensões de aplicativo de teste.

Etapa 3: Visão geral abrangente dos pontos de extensão

Quando estiver confortável com o básico, explore os vários pontos de extensão. Tal incluirá:

  1. Capacidades de Plataforma e Estrutura de Teste: Compreender toda a gama de recursos fornecidos pela plataforma e pela estrutura de teste, permitindo que você os aproveite de forma eficaz.

  2. Custom Test Framework: Como escrever e registrar sua estrutura de teste personalizada, permitindo que você adapte o ambiente de teste aos seus requisitos específicos.

  3. In-Process e Extensões fora do processo: Instruções detalhadas sobre como escrever e registrar extensões dentro e fora do processo, oferecendo flexibilidade na forma como você estende a plataforma.

  4. Ordem de Execução: Clarificar a ordem de execução dos vários pontos de extensão para garantir a integração perfeita e o funcionamento de sua extensão personalizada.

Etapa 4: Serviços disponíveis e auxiliares

Finalmente, você revisa uma lista exaustiva dos serviços disponíveis e funções auxiliares dentro da plataforma. Esta seção servirá como uma referência para ajudá-lo a aproveitar todas as ferramentas à sua disposição para criar extensões de teste robustas e eficientes.

Ao seguir essa abordagem estruturada, você obterá uma compreensão abrangente de nossa plataforma de teste, desde o uso básico até a personalização avançada. Vamos começar e explorar todo o potencial do que a nossa plataforma pode oferecer!

Etapa 1: Registrar e executar um aplicativo de teste simples

Para introduzir a arquitetura da plataforma de teste, este documento usará o aplicativo de console clássico (para Windows) como host. Os exemplos neste documento são escritos em C#, mas você pode usar a plataforma de teste com qualquer linguagem que ofereça suporte à especificação .NET Ecma e executar em qualquer sistema operacional suportado pelo .NET. Para usar a plataforma, basta consultar a montagem Microsoft.Testing.Platform.dll, que pode ser utilizado através do pacote oficial NuGet disponível em https://www.nuget.org/packages/Microsoft.Testing.Platform.

Em um projeto de console Contoso.UnitTests.exe, o seguinte método Main define o ponto de entrada:

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();
}

Esse código inclui tudo o que é necessário para executar uma sessão de teste, exceto para registrar uma estrutura de teste como MSTest até RegisterTestFramework. Este código é mostrado e explicado em seções posteriores.

Observação

O comportamento padrão é ter o ponto de entrada gerado automaticamente pela tarefa MSBuild da plataforma de teste. Isso é feito adicionando o pacote Microsoft.Testing.Platform.MSBuild ao seu projeto.

Quando Contoso.UnitTests.exe aplicativo é iniciado, um processo padrão do Windows é criado e a plataforma de teste interage com a estrutura de teste registrada para executar a sessão de teste.

Um único processo é criado para realizar este trabalho:

Um diagrama que representa o processo do host de teste.

A plataforma de teste inclui um dispositivo de exibição integrado que grava as informações da sessão de teste no terminal, semelhante a:

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)

Observação

Os códigos de saída conhecidos retornados pela chamada ITestApplication.RunAsync() são detalhados nos códigos de saída da plataforma.

Etapa 2: Estendendo a plataforma

As execuções de teste geralmente coletam informações de cobertura de código ou informações semelhantes para avaliar a qualidade do código. Essas cargas de trabalho podem exigir configuração antes do início do processo do host de teste, por exemplo, definindo variáveis de ambiente.

A plataforma de teste acomoda isso por ter extensões de independentes do processo. Ao executar com extensões fora do processo, a plataforma de teste iniciará vários processos e os gerenciará adequadamente.

O exemplo a seguir demonstra como registar uma funcionalidade de cobertura de código usando uma extensão TestHostController.

ITestApplicationBuilder builder = await TestApplication.CreateBuilderAsync(args);

builder.RegisterTestFramework();
builder.AddCodeCoverage();

using ITestApplication testApp = await builder.BuildAsync();

return await testApp.RunAsync();

O builder.AddCodeCoverage(); usa internamente o ponto de extensibilidade TestHostController, que é um ponto de extensibilidade fora do processo.

public static class TestApplicationBuilderExtensions
{
    public static ITestApplicationBuilder AddCodeCoverage(
        this ITestApplicationBuilder builder)
    {
        builder.TestHostControllers
               .AddEnvironmentVariableProvider(/* ... */);
        
        // ...
        
        return builder;
    }
}

Os parâmetros para o AddEnvironmentVariableProvider api serão explicados em seções posteriores.

Ao executar Contoso.UnitTests.exe desta vez, a plataforma de teste deteta que uma extensão de TestHostController está registrada. Como resultado, ele inicia uma nova instância do processo Contoso.UnitTests.exe, que funciona como um processo filho. Isso é feito para definir corretamente as variáveis de ambiente, conforme exigido pela extensão registrada com a API AddEnvironmentVariableProvider.

O layout do processo tem esta aparência:

Um diagrama que representa o layout do processo do host de teste e do controlador do host de teste.

Observação

O exemplo fornecido assume um layout de aplicativo de console, que manipula o processo de início corretamente e propaga todos os argumentos de linha de comando para o processo filho. Se você estiver usando um host diferente, você precisa garantir que o código do ponto de entrada encaminhe corretamente o ponto de entrada do processo (o "Principal") para o bloco de código apropriado. A aplicação "runtime" inicia-se automaticamente com os mesmos argumentos de linha de comando.

A seção acima fornece uma breve introdução à arquitetura da plataforma de teste. Os pontos de extensibilidade atuais são divididos em duas categorias:

  1. Em processo extensões podem ser acessadas por meio da propriedade TestHost do construtor de aplicativos de teste. Em processo significa que eles serão executados no mesmo processo que o framework de teste.

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

    Como observado, o ponto de extensão mais crucial é o framework de testes in-process (RegisterTestFramework), que é o único obrigatório .

  2. extensões fora do processo podem ser acedidas por meio da propriedade TestHostControllers do construtor de aplicações de teste. Essas extensões são executadas em um processo separado da estrutura de teste para "observá-la".

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

Etapa 3: Visão geral abrangente dos pontos de extensão

Vamos começar por nos familiarizar com o conceito de capacidades de antes de mergulhar nos vários pontos de extensões .

Passo 4: Serviços disponíveis

A plataforma de teste oferece serviços valiosos para a estrutura de teste e pontos de extensão. Esses serviços atendem a necessidades comuns, como acessar a configuração, analisar e recuperar argumentos de linha de comando, obter a fábrica de logs e acessar o sistema de logs, entre outros. IServiceProvider implementa o padrão de localizador de serviços para a plataforma de teste.

Todos os serviços, auxiliares e informações técnicas sobre como acessar e usar esses serviços estão listados na documentação Microsoft.Testing.Platform Services.