Třída TestContext

Třída TestContext poskytuje užitečné informace a nástroje pro správu provádění testů. Umožňuje přístup k podrobnostem o testovacím spuštění a úpravě testovacího prostředí. Tato třída je součástí oboru názvů Microsoft.VisualStudio.TestTools.UnitTesting.

Přístup k objektu TestContext

Objekt TestContext je k dispozici v následujících kontextech:

  • Parametrem pro metody AssemblyInitializea ClassInitialize . V tomto kontextu nejsou k dispozici vlastnosti související s testovacím spuštěním.
  • Počínaje verzí 3.6 volitelně jako parametr pro AssemblyCleanup, metody ClassCleanup. V tomto kontextu nejsou k dispozici vlastnosti související s testovacím spuštěním.
  • Jako vlastnost testovací třídy. V tomto kontextu jsou k dispozici vlastnosti související s testovacím spuštěním.
  • Jako parametr konstruktoru třídy testu (počínaje verzí v3.6). Doporučuje se tento způsob před použitím vlastnosti, protože dává přístup k objektu v konstruktoru. Vlastnost je k dispozici pouze po spuštění konstruktoru. Tímto způsobem také pomáhá zajistit neměnnost objektu a umožňuje kompilátoru vynutit, aby objekt nebyl 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
    }
}

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

Členové TestContext

Třída TestContext poskytuje vlastnosti testovacího spuštění spolu s metodami pro manipulaci s testovacím prostředím. Tato část popisuje nejčastěji používané vlastnosti a metody.

Informace o testovacím spuštění

TestContext poskytuje informace o testovacím spuštění, například:

Ve třídě TestContext v MSTest 3.7 a novějších jsou také nové vlastnosti, které jsou užitečné pro metody TestInitialize a TestCleanup:

  • TestContext.TestData – data, která budou poskytována parametrizované metodě testu, nebo null, pokud test není parametrizován.
  • TestContext.TestDisplayName – zobrazovaný název testovací metody.
  • TestContext.TestException – výjimka vyvolaná buď testovací metodou nebo inicializací testu, nebo null, pokud testovací metoda nevyvolala výjimku.

Testy řízené daty

V MSTest 3.7 a novějších lze vlastnost TestContext.TestData použít pro přístup k datům pro aktuální test během metod TestInitialize a TestCleanup.

Při cílení na rozhraní .NET Framework umožňuje TestContext načíst a nastavit data pro každou iteraci v testu řízeném daty pomocí vlastností, jako jsou DataRow a DataConnection (pro testy založené naDataSource).

Zvažte následující soubor CSV TestData.csv:

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

Pomocí atributu DataSource můžete číst data ze souboru 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));
        }
    }
}

Ukládání a načítání dat modulu runtime

Pomocí TestContext.Properties můžete ukládat vlastní páry klíč-hodnota, ke kterým lze přistupovat v různých metodách ve stejné testovací relaci.

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

Note

Od verze MSTest 4.2 jsou do TestContext.Properties zahrnuty také kategorie testů z [TestCategory].

Počínaje verzí MSTest 4.3 se vlastní vlastnosti přidané do TestContext.Properties v [AssemblyInitialize] promítají do každé třídy a každého testu v sestavení a vlastnosti přidané v [ClassInitialize] se promítají do každého testu v této třídě. To umožňuje zařízením publikovat sdílený kontext, který testovací metody mohou číst.

Přistupovat k TestContext z aktuálního zásobníku volání

Počínaje MSTest 4.2 TestContext.Current vrátí aktuální test TestContext odkudkoli v zásobníku volání během provádění testovací metody. Toto rozhraní API je experimentální, používá [Experimental] atribut a může se změnit v budoucí verzi MSTest.

Přidružení dat k testu

Metoda TestContext.AddResultFile(String) umožňuje přidat soubor do výsledků testu a zpřístupnit ho ke kontrole ve výstupu testu. To může být užitečné, pokud během testu vygenerujete soubory (například soubory protokolu, snímky obrazovky nebo datové soubory), které chcete připojit k výsledkům 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.");
    }
}

K zápisu vlastních zpráv přímo do výstupu testu můžete také použít TestContext.Write nebo TestContext.WriteLine metody. To je zvlášť užitečné pro účely ladění, protože poskytuje informace o protokolování v reálném čase v kontextu provádění testu.

Token zrušení

Třída TestContext zpřístupňuje vlastnost CancellationToken, která je signalizována při vypršení časového limitu testu nebo přerušení běhu testu. Tento token byste měli předat asynchronním operacím, aby mohly reagovat na zrušení ve spolupráci. To je zvlášť důležité při použití atributů časového limitu .

Při přístupu k TestContext jako k vlastnosti:

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

Při vkládání TestContext pomocí konstruktoru (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);
    }
}

Návod

Pravidlo analyzátoru MSTest MSTEST0049 pomáhá identifikovat asynchronní volání, kde TestContext.CancellationToken by se měla předávat. Poskytuje také nástroj pro automatickou opravu kódu a aplikování změny.

Následující analyzátory pomáhají zajistit správné použití TestContext třídy:

  • MSTEST0005 – vlastnost TestContext by měla mít platné rozložení.
  • MSTEST0024 – Neukládejte TestContext ve statickém členu.
  • MSTEST0033 – Potlačí CS8618 pro vlastnost TestContext.
  • MSTEST0048 - Vyhněte se vlastnostem TestContext v metodách zařízení.
  • MSTEST0049 – Tok zrušení v TestContextu CancellationToken.
  • MSTEST0054 – použijte vlastnost CancellationToken.