Compartilhar via


Funcionalidades do Microsoft.Testing.Platform

No contexto do Microsoft.Testing.Platform, uma funcionalidade refere-se ao potencial de executar uma ação específica ou fornecer informações específicas. É um meio para a estrutura de teste e extensões declararem sua capacidade de operar de determinada maneira ou fornecer informações específicas aos solicitantes.

Os solicitantes podem ser qualquer componente envolvido em uma sessão de teste, como a plataforma, uma extensão ou a própria estrutura de teste.

O objetivo principal do sistema de funcionalidade é facilitar a comunicação efetiva entre os componentes envolvidos em uma sessão de teste, permitindo que eles exchange informações e atendam às respectivas necessidades com precisão.

Exemplo guiado

Vamos considerar um exemplo hipotético para demonstrar a necessidade de um sistema de funcionalidades.

Observação

Este exemplo é puramente para fins ilustrativos e não está implementado no momento em Microsoft.Testing.Platform ou em qualquer estrutura de teste.

Imagine uma situação em que você tenha uma extensão que exija que a estrutura de teste execute não mais do que um teste por vez. Além disso, após cada teste, a extensão precisa saber o uso da CPU para esse teste específico.

Para acomodar o cenário anterior, você precisará consultar a estrutura de teste se:

  1. Ele tem a capacidade de executar apenas um teste por vez.
  2. Ele pode fornecer informações sobre a quantidade de CPU consumida por cada teste.

Como a extensão pode determinar se a estrutura de teste tem a capacidade de operar nesse modo e fornecer informações de uso da CPU para uma sessão de teste? No Microsoft.Testing.Platform, essa funcionalidade é representada por uma implementação da Microsoft.Testing.Platform.Capabilities.ICapability interface:

// Base capabilities contracts

public interface ICapability
{
}

public interface ICapabilities<TCapability>
    where TCapability : ICapability
{
    IReadOnlyCollection<TCapability> Capabilities { get; }
}

// Specific testing framework capabilities

public interface ITestFrameworkCapabilities : ICapabilities<ITestFrameworkCapability>
{
}

public interface ITestFrameworkCapability : ICapability
{
}

Como você pode ver, a ICapability interface é uma interface de marcador porque pode representar qualquer funcionalidade e a implementação real dependerá do contexto. Você também observará o ITestFrameworkCapability, que herda de ICapability para classificar a capacidade. A natureza genérica do sistema de funcionalidades permite o agrupamento conveniente por contexto. O ITestFrameworkCapability agrupa todos os recursos implementados pelo framework de teste. A ICapabilities<TCapability> interface revela o conjunto de todos os recursos implementados por uma extensão. Da mesma forma, para a base um, há uma estrutura de teste específica para o contexto chamada ITestFrameworkCapabilities. O ITestFrameworkCapabilities é fornecido à plataforma durante o processo de registro do framework de teste.

Para criar um recurso que resolva o cenário mencionado acima, defina-o da seguinte maneira:

public interface IDisableParallelismCapability : ITestFrameworkCapability
{
    bool CanDisableParallelism { get; }
    bool CanProvidePerTestCpuConsumption { get; }
    void Enable();
}

Se a estrutura de teste implementar essa interface, em runtime, o seguinte poderá ser consultado:

  • Verifique se a estrutura de teste tem a capacidade de desativar o paralelismo CanDisableParallelism = true.
  • Determine se a estrutura de teste pode fornecer dados CanProvidePerTestCPUConsumption = truede uso da CPU.
  • Solicite que o adaptador de teste ative esse modo invocando o Enable() método antes do início da sessão de teste.

O fragmento de código hipotético dentro da extensão pode ser algo como:

IServiceProvider provider = null; // TODO: Get IServiceProvider.
var capabilities = serviceProvider.GetRequiredService<ITestFrameworkCapabilities>();

// Utilize the `GetCapability` API to search for the specific capability to query.
var capability = capabilities.GetCapability<IDisableParallelismCapability>();
if (capability is null)
{
    // Capability not supported...
}
else
{
    capability.Enable();
    if (capability.CanDisableParallelism)
    {
        // Do something...
    }

    if (capability.CanProvidePerTestCpuConsumption)
    {
        // Do something...
    }
}

O exemplo anterior ilustra como a infraestrutura de funcionalidade permite um mecanismo poderoso para comunicar habilidades entre os componentes envolvidos em uma sessão de teste. Embora o exemplo demonstre uma funcionalidade especificamente projetada para a estrutura de teste, qualquer componente pode expor e implementar extensões que herdam de ICapability.

É evidente que nem todos os detalhes podem ser comunicados por meio de uma interface. Considerando o exemplo anterior, o que a extensão deve esperar se houver suporte para CanProvidePerTestCpuConsumption? Que tipo de informações personalizadas devem ser transmitidas por meio do IMessageBus pela estrutura de teste? A solução é a documentação da funcionalidade. É responsabilidade do proprietário da funcionalidade projetar, enviar e documentá-lo o mais claramente possível para ajudar os implementadores que desejam colaborar efetivamente com a extensão que requer a funcionalidade específica.

Por exemplo, a extensão de relatório TRX permite que a estrutura de teste implemente a capacidade necessária para gerar com precisão um relatório TRX. A extensão para registro está incluída no pacote NuGet https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport, mas a capacidade de implementação é encontrada apenas no contratohttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions do pacote NuGet.

Em conclusão, vamos resumir os principais aspectos do sistema de funcionalidade:

  • É essencial para facilitar a comunicação clara e estável entre componentes.
  • Todos os recursos devem herdar de ICapability ou de uma interface que herda dele e são expostos por meio de uma coleção com a interface ICapabilities.
  • Ajuda na evolução dos recursos sem causar alterações significativas. Se uma determinada funcionalidade não tiver suporte, medidas apropriadas poderão ser tomadas.
  • A responsabilidade de projetar, enviar e documentar o uso de uma funcionalidade é do proprietário da funcionalidade. Microsoft.Testing.Platform também pode ter uma funcionalidade da mesma forma que qualquer outra extensão.

Funcionalidades da estrutura

A plataforma expõe uma interface especializada chamada ITestFrameworkCapability que é a base de todos os recursos expostos para estruturas de teste. Esses recursos são fornecidos ao registrar a estrutura de teste na plataforma.

IBannerMessageOwnerCapability

Uma capacidade opcional da estrutura de teste que permite que a estrutura de teste forneça a mensagem de banner para a plataforma. Se a mensagem estiver null ou se a funcionalidade não estiver presente, a plataforma usará sua mensagem de banner padrão.

Essa implementação de funcionalidade permite que você abstraia as várias condições que a estrutura de teste pode precisar considerar ao decidir se a mensagem de faixa deve ou não ser exibida.

A plataforma expõe o IPlatformInformation serviço para fornecer algumas informações sobre a plataforma que podem ser úteis ao criar sua mensagem de banner personalizada.