Compartir a través de


Funcionalidades de Microsoft.Testing.Platform

En el contexto de Microsoft.Testing.Platform, una funcionalidad hace referencia al potencial de realizar una acción específica o proporcionar información específica. Es un medio para que el marco de pruebas y las extensiones declaren su capacidad de operar de una manera determinada o proporcionar información específica a los solicitantes.

Los solicitantes pueden ser cualquier componente implicado en una sesión de prueba, como la plataforma, una extensión o el propio marco de pruebas.

El objetivo principal del sistema de funcionalidad es facilitar la comunicación eficaz entre los componentes implicados en una sesión de prueba, lo que les permite intercambiar información y satisfacer sus respectivas necesidades con precisión.

Ejemplo guiado

Consideremos un ejemplo hipotético para demostrar la necesidad de un sistema de funcionalidad.

Nota:

Este ejemplo es exclusivamente para fines ilustrativos y no se implementa actualmente en Microsoft.Testing.Platform ni en ningún marco de pruebas.

Imagine una situación en la que tiene una extensión que requiere que el marco de pruebas no ejecute más de una prueba a la vez. Además, después de cada prueba, la extensión debe conocer el uso de CPU para esa prueba específica.

Para dar cabida al escenario anterior, debe consultar el marco de pruebas si:

  1. Tiene la capacidad de ejecutar solo una prueba a la vez.
  2. Puede proporcionar información sobre la cantidad de CPU consumida por cada prueba.

¿Cómo puede determinar la extensión si el marco de pruebas tiene la capacidad de funcionar en este modo y proporcionar información de uso de CPU para una sesión de prueba? En Microsoft.Testing.Platform, esta funcionalidad se representa mediante una implementación de la Microsoft.Testing.Platform.Capabilities.ICapability interfaz :

// 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 puede ver, la ICapability interfaz es una interfaz de marcador porque puede representar cualquier funcionalidad y la implementación real dependerá del contexto. También observará ITestFrameworkCapability, que hereda de ICapability para clasificar la funcionalidad. La naturaleza genérica del sistema de funcionalidad permite agrupar convenientemente por contexto. El ITestFrameworkCapability agrupa todas las capacidades implementadas por el marco de pruebas. La ICapabilities<TCapability> interfaz revela el conjunto de todas las funcionalidades implementadas por una extensión. Del mismo modo, para el caso base, hay un marco de pruebas específico del contexto denominado ITestFrameworkCapabilities. El ITestFrameworkCapabilities se proporciona a la plataforma durante el proceso de registro del marco de pruebas.

Para crear una funcionalidad que aborde el escenario mencionado anteriormente, defina como se indica a continuación:

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

Si el marco de pruebas implementa esta interfaz, en tiempo de ejecución, se puede consultar lo siguiente:

  • Compruebe si el marco de pruebas tiene la capacidad de desactivar el paralelismo CanDisableParallelism = true.
  • Determine si el marco de pruebas puede proporcionar datos CanProvidePerTestCPUConsumption = truede uso de CPU.
  • Solicite al adaptador de prueba que active este modo invocando el Enable() método antes de que comience la sesión de prueba.

El fragmento de código hipotético dentro de la extensión podría ser algo parecido a:

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...
    }
}

En el ejemplo anterior se muestra cómo la infraestructura de funcionalidad permite un mecanismo eficaz para comunicar capacidades entre los componentes implicados en una sesión de prueba. Aunque el ejemplo muestra una funcionalidad diseñada específicamente para el marco de pruebas, cualquier componente puede exponer e implementar extensiones que heredan de ICapability.

Es evidente que no todos los detalles se pueden comunicar a través de una interfaz. Teniendo en cuenta el ejemplo anterior, ¿qué debe esperar la extensión si se admite CanProvidePerTestCpuConsumption? ¿Qué tipo de información personalizada se espera que se transmita a través de IMessageBus mediante el marco de pruebas? La solución es documentación de la funcionalidad. Es responsabilidad del propietario de la capacidad diseñar, enviar y documentarlo lo más claramente posible para ayudar a los implementadores que desean colaborar eficazmente con la extensión que requiere la funcionalidad específica.

Por ejemplo, la extensión de informe TRX permite al marco de pruebas implementar la funcionalidad necesaria para generar con precisión un informe TRX. La extensión para registrar se incluye en el paquete NuGet de https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport, pero la capacidad de implementar se encuentra en el paquete NuGet solo de contratohttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions.

En conclusión, resumiremos los aspectos principales del sistema de funcionalidad:

  • Es esencial para facilitar la comunicación clara y estable entre los componentes.
  • Todas las funcionalidades deben heredar de ICapability o de una interfaz que herede de esta, y se deben exponer a través de una colección con la interfaz ICapabilities.
  • Ayuda a la evolución de las características sin causar cambios importantes. Si no se admite una determinada funcionalidad, se pueden realizar acciones adecuadas.
  • La responsabilidad de diseñar, enviar y documentar el uso de una funcionalidad reside en el propietario de la funcionalidad. Microsoft.Testing.Platform también puede poseer una funcionalidad de la misma manera que cualquier otra extensión.

Funcionalidades del marco

La plataforma expone una interfaz especializada denominada ITestFrameworkCapability que es la base de todas las funcionalidades expuestas para marcos de pruebas. Estas funcionalidades se proporcionan al registrar el marco de pruebas en la plataforma.

IBannerMessageOwnerCapability

Una funcionalidad opcional del marco de pruebas que permite al marco de pruebas proporcionar el mensaje de banner a la plataforma. Si el mensaje es null o si la funcionalidad no está presente, la plataforma usará su mensaje de banner predeterminado.

Esta implementación de funcionalidad le permite abstraer las diversas condiciones que puede que el marco de pruebas tenga que tener en cuenta al decidir si se debe mostrar o no el mensaje de banner.

La plataforma expone el IPlatformInformation servicio para proporcionar información sobre la plataforma que podría ser útil al compilar el mensaje de banner personalizado.