Поделиться через


Класс TestContext

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

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

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

  • В качестве параметра для методов [AssemblyInitialize] и [ClassInitialize]. В этом контексте свойства, связанные с тестовой запуском, недоступны.
  • Как свойство тестового класса. В этом контексте доступны свойства, связанные с тестовым запуском.
  • В качестве параметра конструктора тестового класса (начиная с версии 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 предоставляет сведения о тестовом запуске, например:

  • TestName — имя выполняемого в настоящее время теста.
  • CurrentTestOutcome — результат текущего теста.
  • FullyQualifiedTestClassName — полное имя тестового класса.
  • TestRunDirectory — каталог, в котором выполняется тестовый запуск.
  • DeploymentDirectory — каталог, в котором находятся элементы развертывания.
  • ResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestRunDirectory.
  • TestRunResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог ResultsDirectory.
  • TestResultsDirectory — каталог, в котором хранятся результаты теста. Обычно это подкаталог в ResultsDirectory.

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

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

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

В MSTest 3.7 и более поздних версиях свойство 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 для записи пользовательских сообщений непосредственно в тестовые выходные данные. Это особенно полезно для отладки, так как оно предоставляет сведения о ведении журнала в режиме реального времени в контексте выполнения теста.