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