Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс
Класс 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 предоставляет сведения о тестовом запуске, например:
- TestContext.TestName — имя выполняемого в настоящее время теста.
- TestContext.CurrentTestOutcome — результат текущего теста.
- TestContext.FullyQualifiedTestClassName — полное имя тестового класса.
- TestContext.TestRunDirectory — каталог, в котором выполняется тестовый запуск.
-
TestContext.DeploymentDirectory — каталог, в котором находятся элементы развертывания. Чтобы заполнить этот каталог, используйте
DeploymentItemAttribute. - TestContext.ResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.TestRunDirectory.
- TestContext.TestRunResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.ResultsDirectory.
- TestContext.TestResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.ResultsDirectory.
- Начиная с MSTest 3.9, TestContext.TestRunCount — количество выполнений текущего теста, начиная с 1. Значение больше 1 при повторном выполнении
[Retry]теста.
Временный каталог для каждого теста
Important
TestContext.TestTempDirectory планируется для MSTest 4.4 и доступен только в предварительных сборках до выпуска MSTest 4.4.0.
Используйте TestContext.TestTempDirectory в качестве частного места для тестирования. MSTest создает каталог только при первом доступе к свойству, а каждое выполнение теста получает уникальный каталог. Каждая строка данных также получает свой собственный каталог, поэтому параллельные тесты не используют пути.
string path = Path.Combine(TestContext.TestTempDirectory!, "output.json");
File.WriteAllText(path, json);
MSTest создает каталог TestResultsDirectory по возможности и возвращается к временному каталогу системы, если путь к результатам недоступен, слишком длинный или доступный только для чтения. MSTest удаляет каталог после прохождения теста и сохраняет его после любого результата без передачи.
MSTEST_TEST_TEMP_DIRECTORY_RETAIN Задайте переменную 1true среды или сохраните каталоги для всех результатов.
При передаче теста регистрирует файл из каталога с AddResultFileпомощью MSTest, пока узел не собирает вложение. Очистка является лучшим усилием и не изменяет результат теста.
TestTempDirectoryдоступен для целевых объектов .NET и .NET Framework, но не для целевых объектов UWP или WinUI. Свойство не изменяет текущий каталог процесса.
В 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();
Note
Начиная с MSTest 4.2, категории тестов из [TestCategory] включаются в TestContext.Properties.
Начиная с MSTest 4.3, настраиваемые свойства, добавленные в TestContext.Properties в [AssemblyInitialize], применяются ко всем классам и тестам в сборке, а свойства, добавленные в [ClassInitialize], применяются ко всем тестам в этом классе. Это позволяет светильникам публиковать общий контекст, который тестовые методы могут читать.
Начиная с MSTest 4.3.3, значений, [TestProperty] категорий тестов, предоставленных узлом свойств и свойств, которые тест добавляет в этот тест, и не выполняет одноуровневые тесты.
Получить доступ к TestContext из текущего стека вызовов
Начиная с MSTest 4.2, TestContext.Current возвращает TestContext текущего теста из любой точки стека вызовов во время выполнения тестового метода. Этот API является экспериментальным, использует [Experimental] атрибут и может измениться в будущей версии MSTest.
Связывание данных с тестом
Метод 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 для записи пользовательских сообщений непосредственно в тестовые выходные данные. Начиная с MSTest 4.4 Live режим записи выходных данных отражает эти сообщения во время выполнения теста и по-прежнему присоединяет их к окончательному результату теста. Дополнительные сведения см. в разделе "Настройка выходных данных MSTest".
Маркер отмены
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.