Condividi tramite


Funzionalità di Microsoft.Testing.Platform

Nel contesto di Microsoft.Testing.Platform, una funzionalità fa riferimento al potenziale per eseguire un'azione specifica o fornire informazioni specifiche. È un mezzo per il framework di test e le estensioni per dichiarare la loro abilità di operare in un certo modo o fornire informazioni specifiche ai richiedenti .

I richiedenti possono essere tutti i componenti coinvolti in una sessione di test, ad esempio la piattaforma, un'estensione o il framework di test stesso.

L'obiettivo principale del sistema di capacità è facilitare la comunicazione efficace tra i componenti coinvolti in una sessione di test, consentendo loro di exchange informazioni e soddisfare accuratamente le rispettive esigenze.

Esempio guidato

Si consideri un esempio ipotetico per dimostrare la necessità di un sistema di funzionalità.

Nota

Questo esempio è puramente a scopo illustrativo e non è attualmente implementato all'interno di Microsoft.Testing.Platform o di alcun framework di test.

Immagina una situazione in cui si dispone di un'estensione che richiede di eseguire non più di un test alla volta. Inoltre, dopo ogni test, l'estensione deve conoscere l'utilizzo della CPU per tale test specifico.

Per soddisfare lo scenario precedente, è necessario chiedere al framework di test se:

  1. Ha la possibilità di eseguire un solo test alla volta.
  2. Può fornire informazioni sulla quantità di CPU utilizzata da ogni test.

In che modo l'estensione può determinare se il framework di test ha la possibilità di operare in questa modalità e fornire informazioni sull'utilizzo della CPU per una sessione di test? In Microsoft.Testing.Platform questa funzionalità è rappresentata da un'implementazione dell'interfaccia Microsoft.Testing.Platform.Capabilities.ICapability :

// 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
{
}

Come si può notare, l'interfaccia ICapability è un'interfaccia marcatore perché può rappresentare qualsiasi funzionalitàe l'implementazione effettiva dipenderà dal contesto. Osserverai anche l'ITestFrameworkCapability, che eredita da ICapability per classificare la capacità. La natura generica del sistema di funzionalità consente un raggruppamento pratico in base al contesto. Il ITestFrameworkCapability raggruppa tutte le funzionalità implementate dal framework di test . L'interfaccia ICapabilities<TCapability> rivela il set di di tutte le funzionalità implementate da un'estensione. Analogamente, per la base 1 è disponibile un framework di test specifico del contesto denominato ITestFrameworkCapabilities. Il ITestFrameworkCapabilities viene fornito alla piattaforma durante il processo di registrazione del framework di test.

Per creare una funzionalità che si rivolge allo scenario precedente, è necessario definirla come segue:

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

Se il framework di test implementa questa interfaccia, in fase di esecuzione è possibile eseguire una query:

  • Verificare se il framework di test ha la possibilità di disattivare il parallelismo CanDisableParallelism = true.
  • Determinare se il framework di test può fornire i dati di utilizzo della CPU CanProvidePerTestCPUConsumption = true.
  • Richiedere all'adattatore di test di attivare questa modalità richiamando il metodo Enable() prima della sessione di test.

Il frammento di codice ipotetico all'interno dell'estensione potrebbe essere simile al seguente:

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

Nell'esempio precedente viene illustrato come l'infrastruttura di funzionalità consenta un meccanismo potente per comunicare le capacità tra i componenti coinvolti in una sessione di test. Mentre l'esempio illustra una funzionalità progettata specificamente per il framework di test, qualsiasi componente può esporre e implementare estensioni che ereditano da ICapability.

È evidente che non tutti i dettagli possono essere comunicati tramite un'interfaccia. Considerando l'esempio precedente, cosa dovrebbe aspettarsi l'estensione se il CanProvidePerTestCpuConsumption è supportato? Quali tipi di informazioni personalizzate devono essere trasmesse tramite il IMessageBus dal framework di test? La soluzione è la documentazione della capacità di. È responsabilità della capacità di proprietario progettare, spedire e documentarlo il più chiaramente possibile per assistere gli implementatori che vogliono collaborare efficacemente collaborare con l'estensione che richiede la funzionalità specifica.

Ad esempio, l'estensione del report TRX consente al framework di test di implementare la funzionalità necessaria per generare in modo accurato un report TRX. L'estensione per la registrazione è inclusa nel pacchetto NuGet https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport, ma la capacità di implementazione si trova solo nel contratto del pacchetto NuGethttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions.

In conclusione, riepilogiamo gli aspetti principali del sistema di funzionalità:

  • È essenziale per facilitare la comunicazione chiara e stabile tra componenti.
  • Tutte le funzionalità devono ereditare da ICapability o da un'interfaccia che eredita da essa e vengono esposte tramite una raccolta con l'interfaccia ICapabilities.
  • Facilita l'evoluzione delle funzionalità senza causare modifiche di rilievo. Se una determinata funzionalità non è supportata, è possibile eseguire un'azione appropriata.
  • La responsabilità di progettare, spedire e documentare l'utilizzo di una funzionalità spetta al proprietario della funzionalità . Microsoft.Testing.Platform può anche possedere una funzionalità nello stesso modo di qualsiasi altra estensione.

Funzionalità del framework

La piattaforma espone un'interfaccia specializzata denominata ITestFrameworkCapability che è la base di tutte le funzionalità esposte per i framework di test. Queste funzionalità vengono fornite quando registrando il framework di test sulla piattaforma.

IBannerMessageOwnerCapability

Una funzionalità del framework di test facoltativa che consente al framework di test di fornire il messaggio banner alla piattaforma. Se il messaggio è null o se la funzionalità non è presente, la piattaforma userà il messaggio banner predefinito.

Questa implementazione di funzionalità consente di astrarre le varie condizioni che il framework di test potrebbe dover prendere in considerazione quando si decide se deve essere visualizzato o meno il messaggio banner.

La piattaforma espone il servizio IPlatformInformation per fornire alcune informazioni sulla piattaforma che potrebbero essere utili durante la compilazione del messaggio banner personalizzato.