Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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:
- Ele tem a capacidade de executar apenas um teste por vez.
- 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
ICapabilityou de uma interface que herda dele e são expostos por meio de uma coleção com a interfaceICapabilities. - 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.