Freigeben über


Microsoft.Testing.Platform-Funktionen

Im Kontext von Microsoft.Testing.Platform bezieht sich eine Funktion auf das Potenzial, eine bestimmte Aktion auszuführen oder bestimmte Informationen bereitzustellen. Es ist ein Mittel für das Testframework und Erweiterungen, um ihre Fähigkeit bekanntzugeben, auf bestimmte Weise zu operieren oder bestimmte Informationen für die Anfragenden bereitzustellen.

Die Anforderer können jede Komponente sein, die an einer Testsitzung beteiligt ist, z. B. die Plattform, eine Erweiterung oder das Testframework selbst.

Das Hauptziel des Funktionssystems ist es, eine effektive Kommunikation zwischen den in einer Testsitzung beteiligten Komponenten zu ermöglichen, die es ihnen ermöglichen, Informationen auszutauschen und ihre jeweiligen Anforderungen genau zu erfüllen.

Geführtes Beispiel

Betrachten wir ein hypothetisches Beispiel, um die Notwendigkeit eines Funktionssystems zu veranschaulichen.

Hinweis

Dieses Beispiel dient ausschließlich zu Veranschaulichungszwecken und wird derzeit nicht innerhalb von Microsoft.Testing.Platform oder einem Testframework implementiert.

Stellen Sie sich eine Situation vor, in der Sie eine Erweiterung haben, die erfordert, dass das Testframework nicht mehr als einen Test gleichzeitig ausführt. Darüber hinaus muss die Erweiterung nach jedem Test die CPU-Auslastung für diesen spezifischen Test kennen.

Um das vorherige Szenario zu berücksichtigen, müssen Sie sich im Testframework erkundigen, wenn:

  1. Es verfügt über die Möglichkeit, jeweils nur einen Test auszuführen.
  2. Es kann Informationen über die Menge der CPU bereitstellen, die von jedem Test verbraucht wird.

Wie kann die Erweiterung bestimmen, ob das Testframework die Möglichkeit hat, in diesem Modus zu arbeiten und CPU-Auslastungsinformationen für eine Testsitzung bereitzustellen? In Microsoft.Testing.Platform wird diese Funktion durch eine Implementierung der Microsoft.Testing.Platform.Capabilities.ICapability Schnittstelle dargestellt:

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

Wie Sie sehen können, ist die ICapability Schnittstelle eine Markerschnittstelle , da sie eine beliebige Funktion darstellen kann und die tatsächliche Implementierung kontextabhängig ist. Sie werden auch das ITestFrameworkCapability beobachten, das von ICapability erbt, um die Fähigkeit zu klassifizieren. Der generische Charakter des Funktionssystems ermöglicht eine bequeme Gruppierung nach Kontext. Die ITestFrameworkCapability gruppiert alle vom Testframework implementierten Fähigkeiten. Die ICapabilities<TCapability> Schnittstelle zeigt den Satz aller Funktionen an, die von einer Erweiterung implementiert werden. Ebenso gibt es für die Basis ein kontextspezifisches Testframework namens ITestFrameworkCapabilities. Das ITestFrameworkCapabilities wird der Plattform während des Registrierungsprozesses des Testframeworks bereitgestellt.

Um eine Funktion zu erstellen, die sich auf das oben genannte Szenario bezieht, definieren Sie sie wie folgt:

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

Wenn das Testframework diese Schnittstelle implementiert, kann zur Laufzeit Folgendes abgefragt werden:

  • Überprüfen Sie, ob das Testframework die Möglichkeit hat, Parallelität CanDisableParallelism = truezu deaktivieren.
  • Ermitteln Sie, ob das Testframework CPU-Auslastungsdaten CanProvidePerTestCPUConsumption = truebereitstellen kann.
  • Fordern Sie den Testadapter an, um diesen Modus zu aktivieren, indem Sie die Enable() Methode aufrufen, bevor die Testsitzung beginnt.

Das hypothetische Codefragment in der Erweiterung könnte etwa wie folgt aussehen:

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

Im vorherigen Beispiel wird veranschaulicht, wie die Funktionsinfrastruktur einen leistungsfähigen Mechanismus für die Kommunikation von Fähigkeiten zwischen den komponenten ermöglicht, die an einer Testsitzung beteiligt sind. Während das Beispiel eine Funktion zeigt, die speziell für das Testframework entwickelt wurde, kann jede Komponente Erweiterungen verfügbar machen und implementieren, die von ICapability erben.

Es ist offensichtlich, dass nicht alle Details über eine Schnittstelle kommuniziert werden können. Was sollte die Erweiterung in Anbetracht des vorherigen Beispiels erwarten, wenn CanProvidePerTestCpuConsumption unterstützt wird? Welche Art von benutzerdefinierten Informationen wird voraussichtlich über den IMessageBus über das Testframework übertragen? Die Lösung ist dokumentation der Funktion. Es liegt in der Verantwortung des Besitzers der Fähigkeit, sie so klar wie möglich zu entwerfen, zu versenden und zu dokumentieren, um Implementierungen zu unterstützen, die effektiv mit der Erweiterung zusammenarbeiten möchten, die die spezifische Funktion erfordert.

Beispielsweise ermöglicht die TRX-Berichtserweiterung dem Testframework die Implementierung der erforderlichen Funktion, um einen TRX-Bericht exakt zu generieren. Die Erweiterung zur Registrierung ist im https://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport NuGet-Paket enthalten, aber die Implementierungsmöglichkeit befindet sich nur im Vertraghttps://www.nuget.org/packages/Microsoft.Testing.Extensions.TrxReport.Abstractions NuGet-Paket.

Abschließend fassen wir die wichtigsten Aspekte des Funktionssystems zusammen:

  • Es ist wichtig, die klare und stabile Kommunikation zwischen Komponenten zu erleichtern.
  • Alle Fähigkeiten sollten von ICapability oder einer Schnittstelle, die von ICapability erbt, erben und über eine Sammlung mit der ICapabilities-Schnittstelle verfügbar gemacht werden.
  • Sie hilft bei der Entwicklung von Features, ohne dass es zu Unterbrechungen kommt. Wenn eine bestimmte Funktion nicht unterstützt wird, können entsprechende Maßnahmen ergriffen werden.
  • Die Verantwortung für das Entwerfen, Versenden und Dokumentieren der Verwendung einer Funktion liegt beim Besitzer der Funktion. Microsoft.Testing.Platform kann auch eine Funktion auf die gleiche Weise besitzen wie jede andere Erweiterung.

Framework-Funktionen

Die Plattform stellt eine spezielle Schnittstelle namens ITestFrameworkCapability bereit, welche die Grundlage aller Fähigkeiten bildet, die für Testframeworks zur Verfügung gestellt werden. Diese Funktionen werden beim Registrieren des Testframeworks für die Plattform bereitgestellt.

IBannerMessageOwnerCapability

Eine optionale Testframeworkfunktion , mit der das Testframework die Bannernachricht für die Plattform bereitstellen kann. Wenn die Nachricht null ist oder die Fähigkeit nicht vorhanden ist, verwendet die Plattform ihre Standard-Bannernachricht.

Mit dieser Funktionsimplementierung können Sie die verschiedenen Bedingungen abstrahieren, die das Testframework möglicherweise berücksichtigen muss, wenn Sie entscheiden, ob die Bannernachricht angezeigt werden soll.

Die Plattform macht den IPlatformInformation Dienst verfügbar, um einige Informationen zur Plattform bereitzustellen, die beim Erstellen Ihrer benutzerdefinierten Bannernachricht hilfreich sein könnten.