Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Класс
Класс 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.