Konfigurieren von „MSTest“

MSTest (Microsoft Testing Framework) ist ein Testframework für .NET-Anwendungen. Sie können damit Tests schreiben und ausführen und Testsuites mit Integration in die Test-Explorer von Visual Studio und Visual Studio Code, die .NET CLI und viele CI-Pipelines bereitstellen.

MSTest ist ein vollständig unterstütztes und plattformübergreifendes Open-Source-Testframework, das mit allen unterstützten .NET-Zielen (.NET Framework, .NET Core, .NET, UWP, WinUI usw.) funktioniert, die auf GitHub gehostet werden.

Runsettings

Eine RUNSETTINGS-Datei kann verwendet werden, um die Ausführung von Komponententests zu konfigurieren. Weitere Informationen zur runsettings-Datei und den Konfigurationen im Zusammenhang mit der Plattform finden Sie in der VSTest-Dokumentation zur runsettings-Datei und der MSTest-Dokumentation zur runsettings-Datei für Runner.

MSTest-Element

Mit den folgenden runsettings-Einträgen können Sie konfigurieren, wie sich MSTest verhalten soll.

Konfiguration Standard Werte
AssemblyCleanupTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Assemblybereinigungsmethode angewendet werden soll. [Timeout] attribut specified on the assembly cleanup method overrides the global timeout.
AssemblyInitializeTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Assemblyinitialisierungsmethode angewendet werden soll. [Timeout] attribut specified on the assembly initialize method overrides the global timeout.
AssemblyResolution Falsch Sie können Pfade zu weiteren Assemblys angeben, wenn Komponententests gefunden und ausgeführt werden. Verwenden Sie diese Pfade beispielsweise für Abhängigkeitsassemblys, die sich nicht im selben Verzeichnis wie die Testassembly befinden. Um einen Pfad anzugeben, verwenden Sie ein Directory Path-Element. Pfade können Umgebungsvariablen enthalten.

<AssemblyResolution> <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/> </AssemblyResolution>

Dieses Feature wird nur bei Verwendung eines .NET Framework-Ziels angewandt.
CaptureTraceOutput Result Erfassen Sie Text aus den Console.Write*, Trace.Write*und Debug.Write* APIs, und ordnen Sie ihn dem aktuellen Test zu. Ab MSTest 4.4 verwenden NoneSie , oder ResultLive. Live auch echot Console, Traceund TestContext.Write* ausgabe an die Konsole, während der Test ausgeführt wird. Die früheren booleschen Werte werden weiterhin unterstützt: true Zuordnungen und Resultfalse Zuordnungen zu None.
ClassCleanupLifecycle EndOfClass Wenn die Klassenbereinigung am Ende der Assembly erfolgen soll, legen Sie den Wert auf EndOfAssembly fest. (Ab MSTest v4 nicht mehr unterstützt, da EndOfClass das Standardverhalten und das einzige ClassCleanup-Verhalten ist)
ClassCleanupTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Klassenbereinigungsmethode angewendet werden soll. Das für die Bereinigungsmethode der Klasse angegebene [Timeout]-Attribut überschreibt das globale Timeout.
ClassInitializeTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Klasseninitialisierungsmethode angewendet werden soll. Das [Timeout]-Attribut, das für die Klasseninitialisierungsmethode angegeben ist, überschreibt das globale Timeout.
ConsiderFixturesAsSpecialTests Falsch Um AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup als einzelne Einträge im Protokoll Test Explorer und .trx von Visual Studio und Visual Studio Code anzuzeigen, legen Sie diesen Wert auf true fest.
DeleteDeploymentDirectoryAfterTestRunIsComplete Wahr Legen Sie diesen Wert auf FALSE fest, um das Bereitstellungsverzeichnis nach einem Testlauf beizubehalten.
DeploymentEnabled Wahr Wenn Sie den Wert auf false festlegen, werden in der Testmethode angegebene Bereitstellungselemente nicht in das Bereitstellungsverzeichnis kopiert.
DeployTestSourceDependencies Wahr Ein Wert, der angibt, ob die Testquellverweise bereitgestellt werden sollen.
EnableBaseClassTestMethodsFromOtherAssemblies Wahr Ein Wert, der angibt, ob die Ermittlung von Testmethoden aus Basisklassen in einer anderen Assembly als der geerbten Testklasse aktiviert werden soll.
ForcedLegacyMode Falsch In älteren Versionen von Visual Studio wurde der MSTest-Adapter für eine schnellere Geschwindigkeit und bessere Skalierbarkeit optimiert. Einige Verhalten, z. B. die Reihenfolge der Testausführung, sind möglicherweise nicht mehr so präzise wie in den vorherigen Versionen von Visual Studio. Legen Sie den Wert auf TRUE fest, um den älteren Testadapter zu verwenden.

Beispielsweise können Sie diese Einstellung verwenden, wenn Sie eine app.config-Datei für einen Komponententest angegeben haben.

Eventuell sollten Sie in Betracht ziehen, die Tests so umzugestalten, dass Sie den späteren Adapter verwenden können.
GlobalTestCleanupTimeout TestCleanupTimeout Geben Sie ab MSTest 4.4 das Timeout für jede globale Testbereinigungsmethode an. Wenn Sie diesen Eintrag weglassen, verwendet TestCleanupTimeoutMSTest . Ein [Timeout] Attribut für die Methode setzt beide Werte außer Kraft.
GlobalTestInitializeTimeout TestInitializeTimeout Geben Sie ab MSTest 4.4 das Timeout für jede globale Testinitialisierungsmethode an. Wenn Sie diesen Eintrag weglassen, verwendet TestInitializeTimeoutMSTest . Ein [Timeout] Attribut für die Methode setzt beide Werte außer Kraft.
LaunchDebuggerOnTestFailure Falsch Ab MSTest 4.2 startet MSTest den Debugger, wenn er auf "true" festgelegt ist, wenn ein Test fehlschlägt.
MapInconclusiveToFailed Falsch Wird ein Test mit einem nicht eindeutigen Status abgeschlossen, wird er im Test-Explorer dem Status „Übersprungen“ zugeordnet. Wenn nicht eindeutige Tests als fehlerhaft angezeigt werden sollen, verwenden Sie den Wert TRUE.
MapNotRunnableToFailed Wahr Ein Wert, der angibt, ob ein nicht ausführbares Ergebnis einem fehlgeschlagenen Test zugeordnet wird.
OrderTestsByNameInClass Falsch Wenn Sie Tests sowohl in Test Explorers als auch in der Befehlszeile nach Testnamen ausführen möchten, setzen Sie diesen Wert auf wahr.
Parallelize Wird verwendet, um die Parallelisierungseinstellungen festzulegen:

Workers: Die Anzahl der Threads/Worker, die für die Parallelisierung verwendet werden sollen, was standardmäßig die Anzahl der Prozessoren auf dem aktuellen Computer ist.

Scope: Der Umfang der Parallelisierung. Sie können sie auf MethodLevelfestlegen. Dieser lautet standardmäßig ClassLevel.

<Parallelize><Workers>32</Workers><Scope>MethodLevel</Scope></Parallelize>
RandomizeTestOrder Falsch Legen Sie ab MSTest 4.3 diesen Wert auf "true " fest, um Tests in einer zufälligen Reihenfolge auszuführen, wodurch ausgeblendete Anordnungsabhängigkeiten zwischen Tests angezeigt werden. Diese Einstellung kann nicht mit OrderTestsByNameInClass kombiniert werden.
RandomTestOrderSeed Ab MSTest 4.3: Wenn RandomizeTestOrder auf true festgelegt ist, legen Sie einen ganzzahligen Seed fest, um die zufällige Reihenfolge über mehrere Läufe hinweg reproduzierbar zu machen. Wenn dies nicht gesetzt ist, wird für jeden Durchlauf ein neuer Seed verwendet.
SettingsFile Sie können eine Testeinstellungsdatei, die mit dem MS-Testadapter verwendet werden soll, hier angeben. Sie können auch eine Testeinstellungsdatei im Menü „Einstellungen“ angeben.

Wenn Sie diesen Wert angeben, müssen Sie auch den ForcedLegacyMode Wert auf "true" festlegen.

<ForcedLegacyMode>true</ForcedLegacyMode>
TestCleanupTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Testbereinigungsmethode angewendet werden soll. Das [Timeout]-Attribut, das für die Testbereinigungsmethode angegeben ist, überschreibt das globale Timeout.
TestInitializeTimeout Nichts Geben Sie global das Timeout an, das für jede Instanz der Testinitialisierungsmethode angewendet werden soll. Das [Timeout]-Attribut, das für die Testinitialisierungsmethode angegeben ist, überschreibt das globale Timeout.
TestTimeout Nichts Ruft das angegebene globale Testfalltimeout ab.
TreatClassAndAssemblyCleanupWarningsAsErrors Falsch Um Ihre Fehler bei Klassenbereinigungen als Fehler anzuzeigen, legen Sie diesen Wert auf true fest.
TreatDiscoveryWarningsAsErrors Falsch Wenn Sie Testerkennungswarnungen als Fehler melden möchten, legen Sie diesen Wert auf true fest.

Timeoutwerte müssen positive ganze Zahlen in Millisekunden sein. Wenn Sie ohne Timeout ausgeführt werden möchten, lassen Sie den Eintrag aus, anstatt ihn auf festzulegen 0. Globale Testeinrichtungstimeouts erben den entsprechenden TestInitializeTimeout wert.TestCleanupTimeout

TestRunParameter-Element

<TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
</TestRunParameters>

Testlaufparameter bieten eine Möglichkeit zum Definieren von Variablen und Werten, die für die Tests zur Laufzeit verfügbar sind. Mithilfe der MSTest-Eigenschaft TestContext.Properties können Sie auf die Parameter zugreifen:

private string _appUrl;
public TestContext TestContext { get; set; }

[TestMethod]
public void HomePageTest()
{
    string _appUrl = TestContext.Properties["webAppUrl"];
}

Fügen Sie Ihrer Testklasse eine öffentliche TestContext-Eigenschaft hinzu, um Testlaufparameter zu verwenden.

Beispiel für eine RUNSETTINGS-Datei

Der folgende XML-Code ist ein Beispiel für den Inhalt einer typischen RUNSETTINGS-Datei. Kopieren Sie diesen Code, und passen Sie ihn Ihren Anforderungen entsprechend an.

Alle Elemente der Datei sind optional, da sie einen Standardwert enthalten.

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>

  <!-- Parameters used by tests at runtime -->
  <TestRunParameters>
    <Parameter name="webAppUrl" value="http://localhost" />
    <Parameter name="webAppUserName" value="Admin" />
    <Parameter name="webAppPassword" value="Password" />
  </TestRunParameters>

  <!-- MSTest -->
  <MSTest>
    <MapInconclusiveToFailed>True</MapInconclusiveToFailed>
    <CaptureTraceOutput>false</CaptureTraceOutput>
    <DeleteDeploymentDirectoryAfterTestRunIsComplete>False</DeleteDeploymentDirectoryAfterTestRunIsComplete>
    <DeploymentEnabled>False</DeploymentEnabled>
    <ConsiderFixturesAsSpecialTests>False</ConsiderFixturesAsSpecialTests>
    <AssemblyResolution>
      <Directory path="D:\myfolder\bin\" includeSubDirectories="false"/>
    </AssemblyResolution>
  </MSTest>

</RunSettings>

testconfig.json

Wenn Sie Ihre Tests mit MSTest ausführen, können Sie eine testconfig.json Datei verwenden, um das Verhalten des Testläufers zu konfigurieren. Die testconfig.json Datei ist eine JSON-Datei, die die Konfigurationseinstellungen für den Testläufer enthält. Die Datei wird verwendet, um den Testläufer und die Testausführungsumgebung zu konfigurieren. Weitere Informationen finden Sie in der MTP-testconfig.json Dokumentation.

Ab MSTest 3.7 können Sie auch die MSTest-Testläufe in derselben Konfigurationsdatei konfigurieren. In den folgenden Abschnitten werden die Einstellungen beschrieben, die Sie in der datei testconfig.json verwenden können.

Ab MSTest 4.3.3 akzeptiert .NET Framework auch Kommentare und nachfolgende Kommas in testconfig.json.

MSTest-Element

MSTest-Einstellungen werden nach Funktionen gruppiert, die in den folgenden Abschnitten beschrieben werden.

Eingabe Standard Beschreibung
Basisklassen-Testmethoden aus anderen Assemblys aktivieren Wahr Ein Wert, der angibt, ob die Ermittlung von Testmethoden aus Basisklassen in einer anderen Assembly als der geerbten Testklasse aktiviert werden soll.
classCleanupLifecycle EndOfAssembly Wenn Sie möchten, dass die Klassenbereinigung am Ende der Klasse stattfindet, setzen Sie sie auf EndOfClass.

assemblyResolution Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum assemblyResolution-Element.

Eingabe Standard Beschreibung
Pfade Nichts Sie können Pfade zu weiteren Assemblys angeben, wenn Komponententests gefunden und ausgeführt werden. Verwenden Sie diese Pfade beispielsweise für Abhängigkeitsassemblys, die sich nicht im selben Verzeichnis wie die Testassembly befinden. Sie können einen Pfad in der Form { "path": "...", "includeSubDirectories": "true/false" }angeben.

Beispiel:

{
  "mstest": {
    "assemblyResolution": {
        { "path": "...", "includeSubDirectories": "true/false" }
    }
  }
}

deployment Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum deployment-Element.

Eingabe Standard Beschreibung
deleteDeploymentDirectoryAfterTestRunIsComplete Wahr Legen Sie diesen Wert auf FALSE fest, um das Bereitstellungsverzeichnis nach einem Testlauf beizubehalten.
deployTestSourceDependencies Wahr Gibt an, ob die Testquellennachweise bereitgestellt werden sollen.
aktiviert Wahr Wenn Sie den Wert auf false festlegen, werden in der Testmethode angegebene Bereitstellungselemente nicht in das Bereitstellungsverzeichnis kopiert.

Beispiel:

{
  "mstest": {
    "deployment": {
        "deleteDeploymentDirectoryAfterTestRunIsComplete": true,
        "deployTestSourceDependencies": true,
        "enabled": true
    }
  }
}

output Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum output-Element.

Eingabe Standard Beschreibung
captureTrace Result Erfassen Console, Traceausgeben und Debug mit dem aktuellen Test verknüpfen. Ab MSTest 4.4 verwenden NoneSie , oder ResultLive. Live gibt auch die Ausgabe an, einschließlich TestContext.Write* Nachrichten, während der Test ausgeführt wird. Die booleschen Werte werden weiterhin unterstützt: true Zuordnungen und falseResultZuordnungen zu None.

Beispiel:

{
  "mstest": {
    "output": {
        "captureTrace": false
    }
  }
}

parallelism Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum parallelism-Element.

Eingabe Standard Beschreibung
aktiviert Falsch Testparallelisierung aktivieren.
scope class Der Umfang der Parallelisierung. Sie können sie auf methodfestlegen. Der Standardwert classentspricht dem sequenziellen Ausführen aller Tests einer bestimmten Klasse, während mehrere Klassen parallel laufen.
Arbeiter 0 Die Anzahl der Threads/Worker, die für die Parallelisierung verwendet werden sollen. Der Standardwert entspricht der Anzahl der Prozessoren auf dem aktuellen Computer.

Beispiel:

{
  "mstest": {
    "parallelism": {
        "enabled": true,
        "scope": "method",
        "workers": 32
    }
  }
}

execution Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum execution-Element.

Eingabe Standard Beschreibung
considerEmptyDataSourceAsInconclusive Falsch Wenn auf true eingestellt, wird eine leere Datenquelle als nicht schlüssig betrachtet.
considerFixturesAsSpecialTests Falsch Zur Anzeige AssemblyInitialize, AssemblyCleanup, ClassInitialize, ClassCleanup als einzelne Einträge in Visual Studio und Visual Studio Code Test Explorer und .trx log, setzen Sie diesen Wert auf wahr.
Abhängigkeiten Deklarieren Sie ab MSTest 4.4 Testabhängigkeit chains und nodes. Diese Einstellung ist nur für Microsoft verfügbar. Testing.Platform. Weitere Informationen finden Sie unter Testabhängigkeiten.
mapInconclusiveToFailed Falsch Wird ein Test mit einem nicht eindeutigen Status abgeschlossen, wird er im Test-Explorer dem Status „Übersprungen“ zugeordnet. Wenn nicht eindeutige Tests als fehlerhaft angezeigt werden sollen, verwenden Sie den Wert TRUE.
Debugger beim Fehlschlagen von Tests starten Falsch Ab Version 4.2 von MSTest startet MSTest den Debugger, wenn die Einstellung auf true festgelegt ist und ein Test fehlschlägt.
mapNotRunnableToFailed Wahr Ein Wert, der angibt, ob ein nicht ausführbares Ergebnis einem fehlgeschlagenen Test zugeordnet wird.
orderTestsByNameInClass Falsch Führen Sie Tests in alphabetischer Reihenfolge innerhalb jeder Klasse aus. Verwenden Sie ab MSTest 4.3 mstest.execution.orderTestsByNameInClass. Der frühere mstest.orderTestsByNameInClass Schlüssel funktioniert weiterhin, erzeugt jedoch eine Warnung zum Veraltet.
randomizeTestOrder Falsch Legen Sie diesen Wert ab MSTest 4.3 auf true fest, um Tests in zufälliger Reihenfolge auszuführen und so verborgene Abhängigkeiten von der Testreihenfolge aufzudecken. Diese Einstellung kann nicht mit orderTestsByNameInClass kombiniert werden.
randomTestOrderSeed Ab MSTest 4.3 können Sie, wenn randomizeTestOrdertrue ist, einen ganzzahligen Seedwert festlegen, um die zufällige Reihenfolge über mehrere Läufe hinweg reproduzierbar zu machen. Wenn dies nicht gesetzt ist, wird für jeden Durchlauf ein neuer Seed verwendet.
treatClassAndAssemblyCleanupWarningsAsErrors Falsch Um Ihre Fehler bei Klassenbereinigungen als Fehler anzuzeigen, legen Sie diesen Wert auf true fest.
BehandleEntdeckungswarnungenAlsFehler Falsch Wenn Sie Testerkennungswarnungen als Fehler melden möchten, legen Sie diesen Wert auf true fest.

Beispiel:

{
  "mstest": {
    "execution": {
        "considerEmptyDataSourceAsInconclusive": false,
        "considerFixturesAsSpecialTests": false,
        "mapInconclusiveToFailed": true,
        "mapNotRunnableToFailed": true,
        "treatClassAndAssemblyCleanupWarningsAsErrors": false,
        "treatDiscoveryWarningsAsErrors": false
    }
  }
}

timeout Einstellungen

Alle Einstellungen in diesem Abschnitt gehören zum timeout-Element.

Eingabe Standard Beschreibung
assemblyCleanup Nichts Geben Sie global das Timeout an, das für jede Instanz der Assemblybereinigungsmethode angewendet werden soll.
assemblyInitialize Nichts Geben Sie global das Timeout an, das für jede Instanz der Assemblyinitialisierungsmethode angewendet werden soll.
classCleanup Nichts Geben Sie global das Timeout an, das für jede Instanz der Klassenbereinigungsmethode angewendet werden soll.
classInitialize Nichts Geben Sie global das Timeout an, das für jede Instanz der Klasseninitialisierungsmethode angewendet werden soll.
globalTestCleanup testCleanup Geben Sie ab MSTest 4.4 das Timeout für jede globale Testbereinigungsmethode an. Wenn Sie diesen Eintrag weglassen, verwendet testCleanupMSTest .
globalTestInitialize testInitialize Geben Sie ab MSTest 4.4 das Timeout für jede globale Testinitialisierungsmethode an. Wenn Sie diesen Eintrag weglassen, verwendet testInitializeMSTest .
test Nichts Legen Sie die Zeitüberschreitung für den Test global fest.
testCleanup Nichts Geben Sie global das Timeout an, das für jede Instanz der Testbereinigungsmethode angewendet werden soll.
testInitialize Nichts Geben Sie global das Timeout an, das für jede Instanz der Testinitialisierungsmethode angewendet werden soll.
useCooperativeCancellation Falsch Bei Einstellung auf true, im Falle einer Zeitüberschreitung löst MSTest nur den Abbruch der CancellationToken wird aber nicht aufhören, die Methode zu beobachten. Dieses Verhalten ist effizienter, setzt jedoch voraus, dass der Benutzer das Token ordnungsgemäß durch alle Pfade führt.

Anmerkung

Timeoutwerte müssen positive ganze Zahlen in Millisekunden sein. Wenn Sie ohne Timeout ausgeführt werden möchten, lassen Sie den Eintrag aus, anstatt ihn auf festzulegen 0. Globale Testinstallationstimeouts erben den entsprechenden Wert oder testCleanup den entsprechenden testInitialize Wert. Lassen Sie daher beide Einträge aus, wenn Sie kein Timeout für eine globale Vorrichtung wünschen. Ein [Timeout] Attribut für eine Methode setzt das konfigurierte Timeout außer Kraft.

Beispiel:

{
  "mstest": {
    "timeout": { "globalTestInitialize": 30000, "globalTestCleanup": 30000 }
  }
}

Beispiel testconfig.json Datei

Der folgende JSON-Code zeigt den Inhalt einer typischen .testconfig.json Datei. Kopieren Sie diesen Code, und passen Sie ihn Ihren Anforderungen entsprechend an.

Alle Elemente der Datei sind optional, da sie einen Standardwert enthalten.

{
  "platformOptions": {
    "resultDirectory": "./TestResults"
  },
  "mstest": {
    "execution": {
        "mapInconclusiveToFailed": true,
        "disableAppDomain": true,
        "considerFixturesAsSpecialTests": false
    },
    "parallelism": {
        "enabled": true,
        "scope": "method"
    },
    "output": {
        "captureTrace": false
    }
  }
}

MSBuild-Eigenschaften

Ab MSTest 4.3 können Sie die Parallelisierung auf Assemblyebene in Ihrer Projektdatei oder mit Directory.Build.props aktivieren, ohne ein [assembly: Parallelize]-Attribut zu erstellen. Diese Eigenschaften generieren während des Builds das entsprechende Assembly-Attribut und erfordern daher, dass GenerateAssemblyInfo auf true festgelegt ist (die Standardeinstellung für Projekte im SDK-Stil).

Property Standard Beschreibung
MSTestParallelizeScope Der Parallelisierungsbereich. Setzen Sie es auf MethodLevel oder ClassLevel, um [assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] (oder ExecutionScope.ClassLevel) auszugeben, oder auf None, um [assembly: DoNotParallelize] auszugeben.
MSTestParallelizeWorkers Die maximale Anzahl von Worker-Threads, ausgegeben als der Wert Workers von [assembly: Parallelize]. Ein Wert von 0 entspricht der Anzahl der Prozessoren auf dem aktuellen Computer. Diese Eigenschaft kann nicht festgelegt werden, wenn MSTestParallelizeScopeNone ist.

MSTest überprüft beide Eigenschaften während des Builds. Ungültige Bereichswerte, Nicht-ganzzahlige Workeranzahl und eine Workeranzahl in Kombination mit einem None Bereich schlägt den Build fehl. Deklarieren [assembly: Parallelize] Oder [assembly: DoNotParallelize] in der Quelle nicht, da das generierte Attribut es duplizieren würde. falseDeklarieren GenerateAssemblyInfo Sie stattdessen das Attribut in der Quelle.

Im folgenden Beispiel wird die Parallelisierung auf Methodenebene mit vier Workern für jedes Testprojekt aktiviert, das die Directory.Build.props Datei importiert:

<Project>
  <PropertyGroup>
    <MSTestParallelizeScope>MethodLevel</MSTestParallelizeScope>
    <MSTestParallelizeWorkers>4</MSTestParallelizeWorkers>
  </PropertyGroup>
</Project>