Udostępnij za pośrednictwem


Klasa TestContext

Klasa TestContext udostępnia przydatne informacje i narzędzia ułatwiające zarządzanie wykonywaniem testów. Umożliwia dostęp do szczegółów przebiegu testu i dostosowywania środowiska testowego. Ta klasa jest częścią przestrzeni nazw Microsoft.VisualStudio.TestTools.UnitTesting.

Uzyskiwanie dostępu do obiektu TestContext

Obiekt TestContext jest dostępny w następujących kontekstach:

  • Jako parametr do metod [AssemblyInitialize] i [ClassInitialize]. W tym kontekście właściwości związane z przebiegem testowym nie są dostępne.
  • Jako właściwość klasy testowej. W tym kontekście dostępne są właściwości związane z przebiegem testu.
  • Jako parametr konstruktora klasy testowej (począwszy od wersji 3.6). Ta metoda jest zalecana zamiast używania właściwości, ponieważ zapewnia dostęp do obiektu w konstruktorze. Chociaż właściwość jest dostępna tylko po uruchomieniu konstruktora. Dzięki temu można również zapewnić niezmienność obiektu i umożliwić kompilatorowi wymuszanie, że obiekt nie ma wartości null.
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
    }
}

Lub przy użyciu narzędzia MSTest 3.6 lub nowszego:

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

Członkowie TestContext

Klasa TestContext zawiera właściwości przebiegu testu wraz z metodami manipulowania środowiskiem testowym. W tej sekcji omówiono najczęściej używane właściwości i metody.

Informacje o przebiegu testu

TestContext zawiera informacje o przebiegu testu, takie jak:

W programie MSTest 3.7 lub nowszym klasa TestContext udostępnia również nowe właściwości przydatne dla metod TestInitialize i TestCleanup:

  • TestContext.TestData — dane, które zostaną dostarczone do sparametryzowanej metody testowej lub null, jeśli test nie jest sparametryzowany.
  • TestContext.TestDisplayName — nazwa wyświetlana metody testowej.
  • TestContext.TestException — wyjątek zgłoszony przez metodę testową lub zainicjowanie testu albo null, jeśli metoda testowa nie zgłosiła wyjątku.

Testy oparte na danych

W programie MSTest 3.7 lub nowszym właściwość TestData może służyć do uzyskiwania dostępu do danych dla bieżącego testu podczas TestInitialize i metod TestCleanup.

W przypadku ukierunkowania na platformę .NET framework, TestContext umożliwia pobieranie i ustawianie danych dla każdej iteracji w teście sterowanym danymi poprzez właściwości, takie jak DataRow i DataConnection (w przypadku testów opartych na DataSource).

Rozważmy następujący plik CSV TestData.csv:

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

Możesz użyć atrybutu DataSource, aby odczytać dane z pliku CSV:

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));
        }
    }
}

Przechowywanie i pobieranie danych środowiska uruchomieniowego

Za pomocą TestContext.Properties można przechowywać niestandardowe pary klucz-wartość, do których można uzyskać dostęp w różnych metodach w tej samej sesji testowej.

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

Kojarzenie danych z testem

Metoda TestContext.AddResultFile(String) umożliwia dodanie pliku do wyników testu, dzięki czemu będzie on dostępny do przeglądu w danych wyjściowych testu. Może to być przydatne w przypadku generowania plików podczas testu (na przykład plików dziennika, zrzutów ekranu lub plików danych), które chcesz dołączyć do wyników testu.

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.");
    }
}

Możesz również użyć metod TestContext.Write lub TestContext.WriteLine, aby zapisywać niestandardowe komunikaty bezpośrednio w danych wyjściowych testu. Jest to szczególnie przydatne w celach debugowania, ponieważ zapewnia w czasie rzeczywistym informacje o logach w kontekście wykonywania testu.