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:

  • Metody ClassInitialize jako parametr dla AssemblyInitialize. W tym kontekście właściwości związane z przebiegem testowym nie są dostępne.
  • Począwszy od wersji 3.6, metody ClassCleanup mogą opcjonalnie przyjmować jako parametr AssemblyCleanup. 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:

Katalog tymczasowy dla każdego testu

Ważna

TestContext.TestTempDirectory Program jest planowany dla programu MSTest 4.4 i jest dostępny tylko w kompilacjach w wersji zapoznawczej do momentu wydania programu MSTest 4.4.0.

Użyj TestContext.TestTempDirectory jako prywatnej przestrzeni roboczej do testu. Narzędzie MSTest tworzy katalog tylko wtedy, gdy uzyskujesz dostęp do właściwości, a każde wykonanie testu otrzymuje unikatowy katalog. Każdy wiersz danych otrzymuje również własny katalog, dlatego testy równoległe nie współużytkują ścieżek.

string path = Path.Combine(TestContext.TestTempDirectory!, "output.json");
File.WriteAllText(path, json);

MSTest tworzy katalog w lokalizacji TestResultsDirectory, gdy jest to możliwe, a w przeciwnym razie używa systemowego katalogu tymczasowego, gdy ścieżka do wyników jest niedostępna, zbyt długa lub tylko do odczytu. MSTest usuwa katalog po pomyślnym zakończeniu testu i pozostawia go w przypadku każdego wyniku innego niż pozytywny. Ustaw zmienną środowiskową MSTEST_TEST_TEMP_DIRECTORY_RETAIN na 1 lub true, aby zachować katalogi dla wszystkich wyników.

Gdy test zakończony powodzeniem rejestruje plik z katalogu za pomocą AddResultFile, MSTest zachowuje ten katalog, dopóki host nie pobierze załącznika. Oczyszczanie jest najlepszym rozwiązaniem i nie zmienia wyniku testu.

TestTempDirectory jest dostępny dla platform docelowych .NET i .NET Framework, ale nie dla platform docelowych UWP ani WinUI. Właściwość nie zmienia bieżącego katalogu procesu.

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ść TestContext.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.

Począwszy od wersji zapoznawczej MSTest 4.4, indeksator zawsze zwraca null, gdy niestandardowy klucz nie istnieje.

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

Note

Począwszy od wersji MSTest 4.2 kategorie testów z [TestCategory] są uwzględniane w TestContext.Properties.

Począwszy od wersji MSTest 4.3 właściwości niestandardowe dodane do TestContext.Properties w [AssemblyInitialize] są przekazywane do każdej klasy i każdego testu w asemblacji, a właściwości dodane w [ClassInitialize] są przekazywane do każdego testu w tej klasie. Umożliwia to fixturom udostępnianie współdzielonego kontekstu, który metody testowe mogą odczytywać.

Od wersji MSTest 4.3.3 wartości [TestProperty], kategorie testów, właściwości dostarczane przez hosta oraz właściwości dodawane przez test pozostają ograniczone do zakresu tego testu i nie są przekazywane do testów równorzędnych.

Uzyskaj dostęp do TestContext w bieżącym stosie wywołań

Od wersji MSTest 4.2 element TestContext.Current zwraca wartość TestContext bieżącego testu z dowolnego poziomu stosu wywołań podczas wykonywania metody testowej. Ten interfejs API jest eksperymentalny, używa atrybutu [Experimental] i może ulec zmianie w przyszłej wersji MSTest.

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. Począwszy od msTest 4.4, Live tryb przechwytywania danych wyjściowych odzwierciedla te komunikaty podczas uruchamiania testu i nadal dołącza je do końcowego wyniku testu. Aby uzyskać więcej informacji, zobacz Konfigurowanie danych wyjściowych MSTest.

Token anulowania

Element TestContext udostępnia właściwość CancellationToken, która jest sygnalizowana, gdy upłynął limit czasu testu lub przebieg testu został przerwany. Ten token należy przekazać do operacji asynchronicznych, aby mogły współpracować przy reagowaniu na anulowanie. Jest to szczególnie ważne w przypadku używania atrybutów limitu czasu .

Gdy dostęp do TestContext jest uzyskiwany jako właściwość:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class TestClassCancellationToken
{
    // MSTest automatically sets the TestContext property before each test runs.
    // MSTest.Analyzers includes a diagnostic suppressor that removes CS8618
    // (non-nullable property uninitialized) for this property.
    public TestContext TestContext { get; set; }

    [TestMethod]
    [Timeout(5000, CooperativeCancellation = true)]
    public async Task MyAsyncTest()
    {
        using var client = new HttpClient();
        var response = await client.GetAsync(
            "https://example.com", TestContext.CancellationToken);

        Assert.IsTrue(response.IsSuccessStatusCode);
    }
}

Kiedy TestContext jest wstrzykiwany przez konstruktor (MSTest 3.6+):

using Microsoft.VisualStudio.TestTools.UnitTesting;

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

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

    [TestMethod]
    [Timeout(5000, CooperativeCancellation = true)]
    public async Task MyAsyncTest()
    {
        using var client = new HttpClient();
        var response = await client.GetAsync(
            "https://example.com", _testContext.CancellationToken);

        Assert.IsTrue(response.IsSuccessStatusCode);
    }
}

Wskazówka

Reguła analizatora MSTest MSTEST0049 pomaga zidentyfikować wywołania asynchroniczne, w których TestContext.CancellationToken należy przekazać. Udostępnia również poprawkę kodu, aby automatycznie zastosować zmianę.

Następujące analizatory pomagają zapewnić prawidłowe użycie TestContext klasy:

  • MSTEST0005 — właściwość TestContext powinna mieć prawidłowy układ.
  • MSTEST0024 — nie przechowuj elementu TestContext w statycznym elemencie członkowskim.
  • MSTEST0033 — pomija właściwość CS8618 dla właściwości TestContext.
  • MSTEST0048 — unikaj właściwości TestContext w metodach konstrukcyjnych.
  • MSTEST0049 — Przepływ CancellationToken TestContext.
  • MSTEST0054 — użyj właściwości CancellationToken.