Бөлісу құралы:


Класс TestContext

Класс TestContext предоставляет полезные сведения и средства для управления выполнением тестов. Он позволяет получать доступ к сведениям о тестовом запуске и настройке тестовой среды. Этот класс является частью пространства имен Microsoft.VisualStudio.TestTools.UnitTesting.

Доступ к объекту TestContext

Объект TestContext доступен в следующих контекстах:

  • В качестве параметра к AssemblyInitializeиспользуются методы ClassInitialize. В этом контексте свойства, связанные с тестовой запуском, недоступны.
  • Начиная с версии 3.6, при желании методы ClassCleanup могут использоваться в качестве параметра для AssemblyCleanup. В этом контексте свойства, связанные с тестовой запуском, недоступны.
  • Как свойство тестового класса. В этом контексте доступны свойства, связанные с тестовым запуском.
  • В качестве параметра конструктора тестового класса (начиная с версии 3.6). Рекомендуется использовать этот способ вместо свойства, поскольку он позволяет получить доступ к объекту в конструкторе. Хотя свойство доступно только после запуска конструктора. Этот способ также помогает обеспечить неизменяемость объекта и позволяет компилятору принудительно применять, что объект не имеет значения 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
    }
}

Или с 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
    }
}

Участники TestContext

Класс TestContext предоставляет свойства тестового выполнения вместе с методами для управления тестовой средой. В этом разделе рассматриваются наиболее часто используемые свойства и методы.

Информация о тестовом запуске

TestContext предоставляет сведения о тестовом запуске, например:

В MSTest 3.7 и более поздних версиях класс TestContext также предоставляет новые свойства, полезные для TestInitialize и методов TestCleanup:

  • TestContext.TestData — данные, которые будут предоставлены параметризованному методу теста или null, если тест не параметризован.
  • TestContext.TestDisplayName — отображаемое имя метода теста.
  • TestContext.TestException — исключение, вызываемое методом теста или инициализацией теста, или null, если метод теста не создает исключение.

Тесты на основе данных

В MSTest 3.7 и более поздних версиях свойство TestContext.TestData можно использовать для доступа к данным для текущего теста во время TestInitialize и TestCleanup методов.

При выборе платформы .NET TestContext позволяет извлекать и задавать данные для каждой итерации в тесте на основе данных, используя такие свойства, как DataRow и DataConnection (для тестов на основе DataSource).

Рассмотрим следующий CSV-файл TestData.csv:

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

Атрибут DataSource можно использовать для чтения данных из 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));
        }
    }
}

Хранение и получение данных среды выполнения

Вы можете использовать TestContext.Properties для хранения пользовательских пар "ключ-значение", к которым можно получить доступ в разных методах в одном тестовом сеансе.

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

Связывание данных с тестом

Метод TestContext.AddResultFile(String) позволяет добавить файл в результаты теста, что делает его доступным для проверки в выходных данных теста. Это может быть полезно, если вы создаете файлы во время теста (например, файлы журналов, снимки экрана или файлы данных), которые необходимо подключить к результатам теста.

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

Можно также использовать методы TestContext.Write или TestContext.WriteLine для записи пользовательских сообщений непосредственно в тестовые выходные данные. Это особенно полезно для отладки, так как оно предоставляет сведения о ведении журнала в режиме реального времени в контексте выполнения теста.

Маркер отмены

TestContext открывает доступ к свойству CancellationToken, которое сигнализирует, когда время выполнения теста истекает или выполнение теста прерывается. Этот токен следует передать в асинхронные операции, так, чтобы они могли координированно реагировать на отмену. Это особенно важно при использовании атрибутов timeout .

При доступе к свойству TestContext:

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

При внедрении TestContext через конструктор (начиная с 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);
    }
}

Подсказка

Правило анализатора MSTest MSTEST0049 помогает определить асинхронные вызовы, в которые следует передавать TestContext.CancellationToken. Он также предоставляет средство исправления кода для автоматического применения изменения.

Следующие анализаторы помогают обеспечить надлежащее использование класса TestContext:

  • MSTEST0005 — свойство TestContext должно иметь допустимый макет.
  • MSTEST0024 — не храните TestContext в статическом элементе.
  • MSTEST0033 . Подавляет свойство CS8618 для TestContext.
  • MSTEST0048 . Избегайте свойств TestContext в методах исправления.
  • MSTEST0049 — Flow TestContext CancellationToken.
  • MSTEST0054 — используйте свойство CancellationToken.