Partilhar via


Recursos do Microsoft.Testing.Platform

No contexto de Microsoft.Testing.Platform, um recurso refere-se ao potencial de executar uma ação específica ou fornecer informações específicas. É um meio para que a estrutura de teste e as extensões declarem sua capacidade para operar de uma 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 principal objetivo do sistema de capacidade é facilitar a comunicação eficaz entre os componentes envolvidos em uma sessão de teste, permitindo-lhes trocar informações e atender às suas respetivas necessidades com precisão.

Exemplo guiado

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

Observação

Este exemplo é meramente ilustrativo e não está atualmente implementado em Microsoft.Testing.Platform ou em qualquer estrutura de teste.

Imagine uma situação em que você tem uma extensão que exige que a estrutura de teste não execute mais de um teste de cada 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ê precisa perguntar na estrutura de teste se:

  1. Tem a capacidade de executar apenas um teste de cada 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? Em Microsoft.Testing.Platform, esse recurso é representado 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 pode ver, ICapability é uma interface de marcador pois pode representar qualquer capacidade, e a implementação real será dependente do contexto. Você também observará o ITestFrameworkCapability, que herda de ICapability para classificar a capacidade. A natureza genérica do sistema de capacidades permite um agrupamento conveniente por contexto. O ITestFrameworkCapability agrupa todas as capacidades implementadas pelo framework de teste . A interface ICapabilities<TCapability> revela o conjunto de todos os recursos implementados por uma extensão. Da mesma forma, para a base, há uma estrutura de teste específica do contexto chamada ITestFrameworkCapabilities. O ITestFrameworkCapabilities é fornecido à plataforma durante o processo de registo da estrutura de teste .

Para criar um recurso que aborda o cenário acima mencionado, 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 tempo de execução, o seguinte pode 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 de uso da CPU CanProvidePerTestCPUConsumption = true.
  • Solicite que o adaptador de teste ative esse modo invocando o método Enable() antes do início da sessão de teste.

O fragmento de código hipotético dentro da extensão poderia 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 capacidade permite um mecanismo poderoso para comunicar habilidades entre os componentes envolvidos em uma sessão de teste. Embora o exemplo demonstre um recurso projetado especificamente 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 através de uma interface. Considerando o exemplo anterior, o que a extensão deve esperar se o CanProvidePerTestCpuConsumption for suportado? Que tipo de informação personalizada se espera que seja transmitida via o IMessageBus pela estrutura de teste? A solução é a documentação da capacidade. É responsabilidade do proprietário da capacidade projetar, enviar e documentar de uma forma o mais clara possível para ajudar os implementadores que desejam efetivamente colaborar com a extensão que requer essa capacidade 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 registo está incluída no pacote NuGet https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport, mas a capacidade de implementação é encontrada apenas no contrato do pacote NuGethttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions.

Em conclusão, vamos resumir os principais aspetos do sistema de capacidade:

  • É essencial para facilitar uma 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 das funcionalidades sem causar alterações de quebra. Se uma certa capacidade não for suportada, podem ser tomadas as medidas apropriadas.
  • A responsabilidade de projetar, enviar e documentar o uso de um recurso é do proprietário da capacidade . Microsoft.Testing.Platform também pode possuir um recurso da mesma forma que qualquer outra extensão.

Capacidades 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 o framework de teste na plataforma.

IBannerMessageOwnerCapability

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

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

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