다음을 통해 공유


MSTest 특성

MSTest는 사용자 지정 특성을 사용하여 테스트를 식별하고 사용자 지정합니다.

테스트 프레임워크의 개요를 보다 명확하게 제공하기 위해 이 섹션에서는 Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스의 멤버가 관련 기능의 그룹으로 구성되어 있습니다.

참고 항목

이름이 "Attribute"로 끝나는 특성은 끝에 "Attribute"를 붙여 사용할 수도 있고, 붙이지 않고 사용할 수도 있습니다. 매개 변수가 없는 생성자가 있는 특성은 괄호를 사용하거나 사용하지 않고 작성할 수 있습니다. 다음 코드 예제는 동일하게 작동합니다.

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

테스트 클래스 및 메서드를 식별하는 데 사용되는 특성

모든 테스트 클래스에는 TestClass 특성이 있어야 하고, 모든 테스트 메서드에는 TestMethod 특성이 있어야 합니다.

TestClassAttribute

TestClass 특성은 테스트를 포함하고 필요에 따라 메서드를 초기화 또는 정리하는 클래스를 표시합니다.

이 특성을 확장하여 기본 동작을 변경하거나 확장할 수 있습니다.

예시:

[TestClass]
public class MyTestClass
{
}

TestMethodAttribute

TestMethod 특성은 TestClass에서 실행할 실제 테스트 메서드를 정의하는 데 사용됩니다.

메서드는 public, void 또는 Task(MSTest v3.3부터)로 정의된 인스턴스 ValueTask 메서드여야 합니다. 필요에 따라 async일 수 있지만 async void여서는 안 됩니다.

이 메서드는 DataRow 특성, DynamicData 특성 또는 테스트 메서드에 테스트 사례 데이터를 제공하는 유사한 특성으로 표시되지 않는 한 매개 변수가 0이어야 합니다.

다음 예제 테스트 클래스를 살펴보세요.

[TestClass]
public class MyTestClass
{
    [TestMethod]
    public void TestMethod()
    {
    }
}

데이터 기반 테스트에 사용되는 특성

다음 요소를 사용하여 데이터 기반 테스트를 설정합니다. 자세한 내용은 데이터 기반 단위 테스트 만들기구성 파일을 사용하여 데이터 원본 정의를 참조하세요.

DataRowAttribute

DataRow 특성을 사용하면 여러 다른 입력으로 동일한 테스트 메서드를 실행할 수 있습니다. 테스트 메서드에 한 번 또는 여러 번 표시될 수 있습니다. TestMethod 특성과 결합해야 합니다.

인수의 수 및 형식이 테스트 메서드 서명과 정확히 일치해야 합니다. 테스트 메서드 매개 변수에 맞는 인라인 인수를 사용하여 DataRowAttribute 사용을 보여 주는 유효한 테스트 클래스의 다음 예제를 살펴보겠습니다.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o)
    {
        // Omitted for brevity.
    }

    [TestMethod]
    [DataRow(new string[] { "line1", "line2" }, new string[] { "line1.", "line2." })]
    public void TestMethod4(string[] input, string[] expectedOutput)
    {
        // Omitted for brevity.
    }
}

참고 항목

params 기능을 사용하여 DataRowAttribute의 여러 입력을 캡처할 수도 있습니다.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, 3, 4)]
    public void TestMethod(params int[] values) {}
}

잘못된 조합의 예:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2)] // Not valid, we are passing 2 inline data but signature expects 1
    public void TestMethod1(int i) {}

    [TestMethod]
    [DataRow(1)] // Not valid, we are passing 1 inline data but signature expects 2
    public void TestMethod2(int i, int j) {}

    [TestMethod]
    [DataRow(1)] // Not valid, count matches but types do not match
    public void TestMethod3(string s) {}
}

참고 항목

MSTest v3부터 정확히 2개의 배열을 전달하려는 경우 개체 배열에서 두 번째 배열을 래핑할 필요가 없습니다. 이전:[DataRow(new string[] { "a" }, new object[] { new string[] { "b" } })]v3부터:[DataRow(new string[] { "a" }, new string[] { "b" })]

DataRowAttribute 속성을 설정하여 Visual Studio 및 각 DisplayName 인스턴스에 대한 로거에 사용되는 표시 이름을 수정할 수 있습니다.

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, 2, DisplayName = "Functional Case FC100.1")]
    public void TestMethod(int i, int j) {}
}

DataRowAttribute상속하여 고유한 특수 DataRow 특성을 만들 수도 있습니다.

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class MyCustomDataRowAttribute : DataRowAttribute
{
}

[TestClass]
public class TestClass
{
    [TestMethod]
    [MyCustomDataRow(1)]
    public void TestMethod(int i) {}
}

초기화 및 정리를 제공하는 데 사용되는 특성

여러 테스트에 공통적인 설정 및 정리를 별도의 메서드로 추출하고 아래에 나열된 특성 중 하나로 표시하여 적절한 시간에 실행할 수 있습니다(예: 모든 테스트 전). 자세한 내용은 단위 테스트 분석을 참조하세요.

어셈블리 수준

AssemblyInitialize 특성은 어셈블리가 로드되고 어셈블리가 언로드되기 직전에 AssemblyCleanup 특성이 호출된 직후에 호출됩니다.

이러한 특성으로 표시된 메서드는 TestClassAttribute표시된 클래스에서 static void, static Task 또는 static ValueTask(MSTest v3.3부터 시작)로 정의되어야 하며 한 번만 나타납니다. 초기화 파트에는 TestContext 형식의 매개 변수가 하나 필요하며, 정리에는 매개 변수가 없거나 MSTest 3.8부터 TestContext형식의 매개 변수가 하나 있을 수 있습니다.

[TestClass]
public class MyTestClass
{
    [AssemblyInitialize]
    public static void AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static void AssemblyCleanup() // Starting with MSTest 3.8, it can be AssemblyCleanup(TestContext testContext)
    {
    }
}

클래스 수준

ClassInitialize 특성은 클래스가 로드되기 직전에 호출되고(정적 생성자 이후) 클래스가 언로드된 직후에 ClassCleanup 호출됩니다.

중요하다

기본적으로 ClassCleanupAttribute 어셈블리의 마지막 테스트 후에 트리거됩니다(AssemblyCleanupAttribute유사하게). 특성에 대한 CleanupBehavior 설정하여 이 동작을 변경할 수 있습니다. 또는 어셈블리 특성 ClassCleanupExecutionAttribute사용하여 어셈블리에 대해 이 동작을 전역적으로 설정할 수 있습니다.

상속 동작을 제어할 수도 있습니다. InheritanceBehavior.None사용하는 현재 클래스 또는 InheritanceBehavior.BeforeEachDerivedClass사용하는 모든 파생 클래스에 대해서만 가능합니다.

이러한 특성으로 표시된 메서드는 static void에서 static Task, static ValueTask 또는 TestClass(MSTest v3.3부터)로 정의되어야 하며 한 번만 표시됩니다. 초기화 파트에는 TestContext 형식의 매개 변수가 하나 필요하며, 정리에는 매개 변수가 없거나 MSTest 3.8부터 TestContext형식의 매개 변수가 하나 있을 수 있습니다.

[TestClass]
public class MyTestClass
{
    [ClassInitialize]
    public static void ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static void ClassCleanup() // Starting with MSTest 3.8, it can be ClassCleanup(TestContext testContext)
    {
    }
}

테스트 수준

TestInitialize 특성은 테스트가 시작되기 직전에 호출되며 테스트가 완료된 직후에 TestCleanup 호출됩니다.

TestInitializeAttribute는 클래스 생성자와 비슷하지만 일반적으로 긴 초기화 또는 비동기 초기화에 더 적합합니다. TestInitializeAttribute 항상 생성자 후에 호출되고 각 테스트(데이터 기반 테스트각 항목 포함)에 대해 호출됩니다.

TestCleanupAttributeDispose(또는 DisposeAsync) 클래스와 비슷하지만 일반적으로 긴 정리 또는 비동기 정리에 더 적합합니다. TestCleanupAttribute 항상 DisposeAsync/Dispose 직전에 호출되고 각 테스트(데이터 기반 테스트각 항목 포함)에 대해 호출됩니다.

이러한 특성으로 표시된 메서드는 void에서 Task, ValueTask 또는 TestClass(MSTest v3.3부터)로 정의되어야 하고, 매개 변수가 없어야 하며, 한 번 또는 여러 번 표시됩니다.

[TestClass]
public class MyTestClass
{
    [TestInitialize]
    public void TestInitialize()
    {
    }

    [TestCleanup]
    public void TestCleanup()
    {
    }
}

테스트 실행을 제어하는 ​​데 사용되는 특성

다음 특성을 사용하여 테스트 실행 방법을 수정할 수 있습니다.

TimeoutAttribute

Timeout 특성을 사용하여 테스트 메서드를 실행할 수 있는 최대 시간(밀리초)을 지정할 수 있습니다. 테스트 메서드가 지정된 시간보다 오래 실행되면 테스트가 중단되고 실패한 것으로 표시됩니다.

이 특성은 모든 테스트 메서드 또는 모든 픽스쳐 메서드(초기화 및 정리 메서드)에 적용할 수 있습니다. runsettings 파일의 시간 제한 속성을 사용하여 모든 테스트 메서드 또는 모든 테스트 픽스쳐 메서드에 대한 시간 제한을 전체적으로 지정할 수도 있습니다.

참고 항목

시간 제한이 정확하지 않을 수도 있습니다. 지정된 시간이 지나면 테스트가 중단되지만 단계가 취소되기까지 더 오래 걸릴 수 있습니다.

시간 제한 기능을 사용하는 경우 테스트 메서드를 실행하기 위해 별도의 스레드/작업이 만들어집니다. 주 스레드/작업은 시간 제한을 모니터링하고 시간 제한에 도달하면 메서드 스레드/작업을 확인하지 않습니다.

MSTest 3.6부터 특성(또는 runettings를 통해 전체적으로)에 CooperativeCancellation 속성을 지정하여 협조적 취소를 사용하도록 설정할 수 있습니다. 이 모드에서 메서드는 일반적인 async 메서드에서와 같이 신호를 받으면 취소 토큰을 확인하고 테스트를 중단합니다. 이 모드는 성능이 더 높으며 취소 프로세스를 보다 정확하게 제어할 수 있습니다. 이 모드는 비동기 및 동기화 메서드 모두에 적용할 수 있습니다.

STATestClassAttribute

테스트 클래스에 적용할 때 STATestClass 특성은 클래스의 모든 테스트 메서드(및 [ClassInitialize][ClassCleanup] 메서드)를 STA(단일 스레드 아파트)에서 실행해야 임을 나타냅니다. 이 특성은 테스트 메서드가 STA가 필요한 COM 개체와 상호 작용할 때 유용합니다.

참고 항목

이 기능은 Windows 및 버전 3.6 이상에서만 지원됩니다.

STATestMethodAttribute

테스트 메서드에 적용된 경우 STATestMethod 특성은 테스트 메서드를 STA(단일 스레드 아파트)에서 실행해야 임을 나타냅니다. 이 특성은 테스트 메서드가 STA가 필요한 COM 개체와 상호 작용할 때 유용합니다.

참고 항목

이 기능은 Windows 및 버전 3.6 이상에서만 지원됩니다.

ParallelizeAttribute

기본적으로 MSTest는 순차적으로 테스트를 실행합니다. 병렬화 특성을 어셈블리 수준 속성으로 사용하여 테스트를 병렬로 실행할 수 있습니다. 병렬 처리를 클래스 수준(여러 클래스를 병렬로 실행할 수 있지만 지정된 클래스의 테스트가 순차적으로 실행됨) 또는 메서드 수준으로 지정할 수 있습니다.

병렬 실행에 사용할 최대 스레드 수를 지정할 수도 있습니다. 값 0(기본값)은 스레드 수가 컴퓨터의 논리 프로세서 수와 동일하다는 것을 의미합니다.

runsettings 파일의 병렬화 속성을 통해 병렬 처리를 지정할 수도 있습니다.

DoNotParallelizeAttribute

DoNotParallelize 특성을 사용하여 지정된 어셈블리에서 테스트의 병렬 실행을 방지할 수 있습니다. 이 특성은 어셈블리 수준, 클래스 수준 또는 메서드 수준에서 적용할 수 있습니다.

참고 항목

기본적으로 MSTest는 순차적으로 테스트를 실행하므로, 어셈블리 수준 Parallelize 특성을 적용한 경우에만 이 속성을 사용해야 합니다.

RetryAttribute

Retry 특성은 MSTest 3.8에서 도입되었습니다. 이 특성으로 인해 테스트 메서드가 실패하거나 시간 초과 시 다시 시도됩니다. 최대 재시도 횟수, 재시도 사이의 시간 지연 및 상수 또는 지수인 지연 백오프 유형을 지정할 수 있습니다.

테스트 메서드에는 RetryAttribute 하나만 있어야 하며 TestMethod표시되지 않은 메서드에서는 RetryAttribute 사용할 수 없습니다.

참고 항목

RetryAttribute는 추상 RetryBaseAttribute에서 파생됩니다. 기본 제공 RetryAttribute 요구 사항을 충족하지 않는 경우 고유한 재시도 구현을 만들 수도 있습니다.

유틸리티 특성

DeploymentItemAttribute

DeploymentItem 특성은 배포 디렉터리에 배포 항목으로 지정된 파일 또는 폴더를 복사하는 데 사용됩니다(복사한 파일이 프로젝트 폴더 내의 TestResults 폴더에 있는 사용자 지정 출력 경로를 추가하지 않고). 배포 디렉터리에는 테스트 프로젝트 DLL과 함께 모든 배포 항목이 있습니다.

테스트 클래스(TestClass 특성으로 표시된 클래스) 또는 테스트 메서드(TestMethod 특성으로 표시된 메서드)에서 사용할 수 있습니다.

사용자는 특성의 여러 인스턴스를 사용하여 둘 이상의 항목을 지정할 수 있습니다.

여기에서 해당 생성자를 볼 수 있습니다.

예제

[TestClass]
[DeploymentItem(@"C:\classLevelDepItem.xml")]   // Copy file using some absolute path
public class UnitTest1
{
    [TestMethod]
    [DeploymentItem(@"..\..\methodLevelDepItem1.xml")]   // Copy file using a relative path from the dll output location
    [DeploymentItem(@"C:\DataFiles\methodLevelDepItem2.xml", "SampleDataFiles")]   // File will be added under a SampleDataFiles in the deployment directory
    public void TestMethod1()
    {
        string textFromFile = File.ReadAllText("classLevelDepItem.xml");
    }
}

Warning

배포 디렉터리에 파일을 복사하는 데 이 특성을 사용하지 않는 것이 좋습니다.

ExpectedExceptionAttribute

ExpectedException 특성은 테스트 메서드가 throw해야 하는 예외를 정의합니다. 예상된 예외가 throw되고 예외 메시지가 예상된 메시지와 일치하는 경우 테스트가 통과합니다.

Warning

이 특성은 이전 버전과의 호환성을 위해 존재하며 새 테스트에는 권장되지 않습니다. 대신 Assert.ThrowsException(또는 MSTest 3.8 이상을 사용하는 경우 Assert.ThrowsExactly) 메서드를 사용합니다.

metadata 특성

다음 특성 및 해당 특성에 할당된 값은 특정 테스트 메서드에 대해 Visual Studio속성 창에 표시됩니다. 이러한 특성은 테스트의 코드를 통해 액세스할 수 없습니다. 대신 개발자가 Visual Studio의 IDE를 통해, 또는 Visual Studio 테스트 엔진이 테스트를 사용하거나 실행하는 방식에 영향을 줍니다. 예를 들어, 이러한 특성 중 일부는 테스트 관리자 창과 테스트 결과 창에 열로 표시됩니다. 즉, 이러한 특성을 사용하여 테스트 및 테스트 결과를 그룹화하고 정렬할 수 있습니다. 이러한 특성 중 하나로 테스트에 임의의 메타데이터를 추가하는 데 사용하는 TestPropertyAttribute가 있습니다.

예를 들어 이 특성을 사용하면 테스트를 [TestProperty("Feature", "Accessibility")]로 표시하여 이 테스트에 포함되는 "테스트 합격"의 이름을 저장할 수 있습니다. 또는 테스트의 종류를 나타내는 표시기([TestProperty("ProductMilestone", "42")])를 저장하는 데 이 특성을 사용할 수 있습니다. 이 특성을 사용하여 만드는 속성과 할당하는 속성 값은 둘 다 Visual Studio 속성 창에서 테스트 특정이라는 제목 아래에 표시됩니다.

아래의 특성은 데코레이팅하는 테스트 메서드와 Team Foundation Server 팀 프로젝트의 프로젝트 계층 구조 내 엔터티 간의 관계를 설정합니다.