Teilen über


Die TestContext-Klasse

Die TestContext Klasse bietet nützliche Informationen und Tools zum Verwalten der Testausführung. Sie können auf Details zur Testausführung zugreifen und die Testumgebung anpassen. Diese Klasse ist Teil des Microsoft.VisualStudio.TestTools.UnitTesting Namespaces.

Zugreifen auf das TestContext Objekt

Das TestContext Objekt ist in den folgenden Kontexten verfügbar:

  • Als Parameter für AssemblyInitialize werden die ClassInitialize-Methoden verwendet. In diesem Zusammenhang sind die Eigenschaften im Zusammenhang mit der Testausführung nicht verfügbar.
  • Ab Version 3.6 können, optional als Parameter zu AssemblyCleanup, die ClassCleanup-Methoden verwendet werden. In diesem Zusammenhang sind die Eigenschaften im Zusammenhang mit der Testausführung nicht verfügbar.
  • Als Eigenschaft einer Testklasse. In diesem Zusammenhang sind die Eigenschaften im Zusammenhang mit der Testausführung verfügbar.
  • Als Konstruktorparameter einer Testklasse (beginnend mit v3.6). Diese Methode wird gegenüber der Verwendung der Eigenschaft empfohlen, da sie Zugriff auf das Objekt im Konstruktor bietet. Die Eigenschaft ist erst verfügbar, nachdem der Konstruktor durchgelaufen ist. Auf diese Weise können Sie die Unveränderlichkeit des Objekts sicherstellen und dem Compiler ermöglichen, durchzusetzen, dass das Objekt nicht null ist.
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class MyTestClassTestContext
{
    public TestContext TestContext { get; set; }

    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext context)
    {
        // Access TestContext properties and methods here. The properties related to the test run are not available.
    }

    [ClassInitialize]
    public static void ClassInitialize(TestContext context)
    {
        // Access TestContext properties and methods here. The properties related to the test run are not available.
    }

    [TestMethod]
    public void MyTestMethod()
    {
        // Access TestContext properties and methods here
    }
}

Oder mit MSTest 3.6+:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class MyTestClassTestContextThroughCtor
{
    private readonly TestContext _testContext;

    public MyTestClassTestContextThroughCtor(TestContext testContext)
    {
        _testContext = testContext;
    }

    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext context)
    {
        // Access TestContext properties and methods here. The properties related to the test run are not available.
    }

    [ClassInitialize]
    public static void ClassInitialize(TestContext context)
    {
        // Access TestContext properties and methods here. The properties related to the test run are not available.
    }

    [TestMethod]
    public void MyTestMethod()
    {
        // Access TestContext properties and methods here
    }
}

Die TestContext-Elemente.

Die TestContext Klasse stellt Eigenschaften zur Testausführung zusammen mit Methoden zum Bearbeiten der Testumgebung bereit. In diesem Abschnitt werden die am häufigsten verwendeten Eigenschaften und Methoden behandelt.

Testlaufinformationen

Dies TestContext enthält Informationen zur Testausführung, z. B.:

In MSTest 3.7 und höher bietet die Klasse auch neue Eigenschaften, die für Methoden wie TestContext und TestInitialize hilfreich sind:

  • TestContext.TestData - die Daten, die der parametrisierten Testmethode bereitgestellt werden, oder null wenn der Test nicht parametrisiert ist.
  • TestContext.TestDisplayName - der Anzeigename der Testmethode.
  • TestContext.TestException - die Ausnahme, die entweder von der Testmethode oder der Initialisierung des Tests ausgelöst wurde, oder eine Ausnahme von null, falls die Testmethode keine Ausnahme ausgelöst hat.

Datengesteuerte Tests

In MSTest 3.7 und höher kann die Eigenschaft TestContext.TestData verwendet werden, um auf die Daten für den aktuellen Test während TestInitialize und TestCleanup methoden zuzugreifen.

Bei der Auswahl des .NET Framework TestContext können Sie mithilfe von Eigenschaften wie DataRow und DataConnection Daten für jede Iteration in einem datengesteuerten Test abrufen und festlegen (für DataSource-basierte Tests).

Betrachten Sie die folgende CSV-Datei TestData.csv:

Number,Name
1,TestValue1
2,TestValue2
3,TestValue3

Sie können das DataSource Attribut verwenden, um die Daten aus der CSV-Datei zu lesen:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace YourNamespace
{
    [TestClass]
    public class CsvDataDrivenTest
    {
        public TestContext TestContext { get; set; }

        [TestMethod]
        [DataSource(
            "Microsoft.VisualStudio.TestTools.DataSource.CSV",
            "|DataDirectory|\\TestData.csv",
            "TestData#csv",
            DataAccessMethod.Sequential)]
        public void TestWithCsvDataSource()
        {
            // Access data from the current row
            int number = Convert.ToInt32(TestContext.DataRow["Number"]);
            string name = TestContext.DataRow["Name"].ToString();

            Console.WriteLine($"Number: {number}, Name: {name}");

            // Example assertions or logic
            Assert.IsTrue(number > 0);
            Assert.IsFalse(string.IsNullOrEmpty(name));
        }
    }
}

Speichern und Abrufen von Laufzeitdaten

Sie können verwenden TestContext.Properties , um benutzerdefinierte Schlüsselwertpaare zu speichern, auf die über verschiedene Methoden in derselben Testsitzung zugegriffen werden kann.

TestContext.Properties["MyKey"] = "MyValue";
string value = TestContext.Properties["MyKey"]?.ToString();

Zuordnen von Daten zu einem Test

Mit der TestContext.AddResultFile(String) Methode können Sie den Testergebnissen eine Datei hinzufügen und sie in der Testausgabe zur Überprüfung zur Verfügung stellen. Dies kann hilfreich sein, wenn Sie Dateien während des Tests generieren (z. B. Protokolldateien, Screenshots oder Datendateien), die Sie den Testergebnissen anfügen möchten.

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class TestClassResultFile
{
    public TestContext TestContext { get; set; }

    [TestMethod]
    public void TestMethodWithResultFile()
    {
        // Simulate creating a log file for this test
        string logFilePath = Path.Combine(TestContext.TestRunDirectory, "TestLog.txt");
        File.WriteAllText(logFilePath, "This is a sample log entry for the test.");

        // Add the log file to the test result
        TestContext.AddResultFile(logFilePath);

        // Perform some assertions (example only)
        Assert.IsTrue(File.Exists(logFilePath), "The log file was not created.");
        Assert.IsTrue(new FileInfo(logFilePath).Length > 0, "The log file is empty.");
    }
}

Sie können auch die Methoden TestContext.Write oder TestContext.WriteLine verwenden, um benutzerdefinierte Nachrichten direkt in die Testausgabe zu schreiben. Dies ist besonders hilfreich für Debuggingzwecke, da sie Echtzeitprotokollierungsinformationen innerhalb des Testausführungskontexts bereitstellt.