TestContext 클래스는 테스트 실행을 관리하는 데 도움이 되는 유용한 정보와 도구를 제공합니다. 테스트 실행에 대한 세부 정보에 액세스하고 테스트 환경을 조정할 수 있습니다. 이 클래스는 Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스의 일부입니다.
TestContext 개체를 액세스
TestContext 개체는 다음 컨텍스트에서 사용할 수 있습니다.
- AssemblyInitialize의 매개변수로서 ClassInitialize 메서드입니다. 이 컨텍스트에서는 테스트 실행과 관련된 속성을 사용할 수 없습니다.
- 3.6부터 시작하여, AssemblyCleanup의 매개 변수로 ClassCleanup 메서드를 옵션으로 사용할 수 있습니다. 이 컨텍스트에서는 테스트 실행과 관련된 속성을 사용할 수 없습니다.
- 테스트 클래스의 속성입니다. 이 컨텍스트에서는 테스트 실행과 관련된 속성을 사용할 수 있습니다.
- 테스트 클래스의 생성자 매개 변수(v3.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에서 계산)입니다. 를 사용하여 테스트를 다시 시도
[Retry]하면 값이 1보다 큽다.
테스트별 임시 디렉터리
테스트를 위한 프라이빗 스크래치 공간으로 사용합니다 TestContext.TestTempDirectory . MSTest는 속성에 처음 액세스할 때만 디렉터리를 만들고 각 테스트 실행은 고유한 디렉터리를 받습니다. 각 데이터 행은 자체 디렉터리도 수신하므로 병렬 테스트는 경로를 공유하지 않습니다.
string path = Path.Combine(TestContext.TestTempDirectory!, "output.json");
File.WriteAllText(path, json);
MSTest는 가능한 경우 디렉터리를 TestResultsDirectory 만들고 결과 경로를 사용할 수 없거나 너무 길거나 읽기 전용인 경우 시스템 임시 디렉터리로 돌아갑니다. MSTest는 테스트가 통과하면 디렉터리를 삭제하고, 통과하지 못한 결과가 나오면 디렉터리를 유지합니다. 환경 변수를 MSTEST_TEST_TEMP_DIRECTORY_RETAIN1 모든 결과에 대한 디렉터리를 유지하거나 true 유지하도록 설정합니다.
통과 테스트가 디렉터리 AddResultFile에서 파일을 등록하는 경우 MSTest는 호스트가 첨부 파일을 수집할 때까지 디렉터리를 유지합니다. 정리는 최선의 노력이며 테스트 결과를 변경하지 않습니다.
TestTempDirectory는 .NET 및 .NET Framework 대상에 사용할 수 있지만 UWP 또는 WinUI 대상에는 사용할 수 없습니다. 속성은 프로세스 현재 디렉터리를 변경하지 않습니다.
MSTest 3.7 이상에서 TestContext 클래스는 TestInitialize 및 TestCleanup 메서드에 유용한 새 속성도 제공합니다.
- 데이터 TestContext.TestData는 매개 변수가 있는 테스트 메서드에 제공되며, 테스트가 매개 변수화되지 않은 경우에는
null이 제공됩니다. - TestContext.TestDisplayName - 테스트 메서드의 표시 이름입니다.
-
TestContext.TestException - 테스트 메서드 또는 테스트 초기화에서 throw된 예외이거나, 테스트 메서드가 예외를 throw하지 않은 경우
null.
데이터 기반 테스트
MSTest 3.7 이상에서는 속성 TestContext.TestData 사용하여 TestInitialize 및 TestCleanup 메서드 중에 현재 테스트의 데이터에 액세스할 수 있습니다.
.NET Framework을 대상으로 할 때, 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 사용하여 동일한 테스트 세션에서 여러 메서드에서 액세스할 수 있는 사용자 지정 키-값 쌍을 저장할 수 있습니다.
MSTest 4.4부터 인덱서는 사용자 지정 키가 없을 때 일관되게 반환 null 합니다.
TestContext.Properties["MyKey"] = "MyValue";
string value = TestContext.Properties["MyKey"]?.ToString();
Note
MSTest 4.2부터는 [TestCategory]의 테스트 범주가 TestContext.Properties에 포함됩니다.
MSTest 4.3부터 TestContext.Properties에서 [AssemblyInitialize]에 추가된 사용자 지정 속성은 어셈블리의 모든 클래스와 테스트에 적용되며, [ClassInitialize]에 추가된 속성은 해당 클래스의 모든 테스트에 적용됩니다. 이를 통해 fixtures는 테스트 메서드가 읽을 수 있는 공유 컨텍스트를 게시할 수 있습니다.
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.");
}
}
MSTest 4.5 미리 보기부터 네이티브 MTP 어댑터는 이러한 결과 파일을 테스트 첨부 파일로 유지하므로 MTP 보고서 확장 프로그램에 포함할 수 있습니다.
TestContext.Write 또는 TestContext.WriteLine 메서드를 사용하여 테스트 출력에 직접 사용자 지정 메시지를 작성할 수도 있습니다. MSTest 4.4부터 Live 출력 캡처 모드는 테스트가 실행되는 동안 이 메시지들을 그대로 표시하고, 최종 테스트 결과에도 계속 첨부합니다. 자세한 내용은 MSTest 출력 구성을 참조하세요.
취소 토큰
테스트 TestContext 시간이 초과되거나 테스트 실행이 중단될 때 신호를 발생시키는 CancellationToken 속성을 제공합니다. 취소에 협조적으로 응답할 수 있도록 비동기 작업에 이 토큰을 전달해야 합니다. 이는 시간 제한 특성을 사용할 때 특히 중요합니다.
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 - TestContext 속성에 대한 CS8618을 표시하지 않습니다.
- MSTEST0048 - fixture 메서드에서 TestContext 속성을 사용하지 않습니다.
- MSTEST0049 - Flow TestContext CancellationToken.
- MSTEST0054 - CancellationToken 속성을 사용합니다.
.NET