Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Класс
Класс 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 — каталог, в котором находятся элементы развертывания.
- TestContext.ResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.TestRunDirectory.
- TestContext.TestRunResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.ResultsDirectory.
- TestContext.TestResultsDirectory — каталог, в котором хранятся результаты теста. Обычно подкаталог TestContext.ResultsDirectory.
В 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.