단위 테스트에서 MSTest 프레임워크 사용

MSTest 프레임워크는 Visual Studio의 유닛 테스트를 지원합니다. 단위 테스트를 코딩하는 경우 Microsoft.VisualStudio.TestTools.UnitTesting 네임스페이스의 클래스 및 멤버를 사용합니다. 코드에서 생성된 단위 테스트를 세분화할 때도 사용할 수 있습니다.

프레임워크 멤버

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

참고

이름이 "Attribute"로 끝나는 특성 요소는 끝에 "Attribute"를 포함하거나 포함하지 않고 사용할 수 있으며 괄호를 포함하거나 포함하지 않는 매개 변수 없는 생성자에 사용할 수 있습니다. 예를 들어 다음 코드 예제는 동일하게 작동합니다.

[TestClass()]

[TestClassAttribute()]

[TestClass]

[TestClassAttribute]

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

모든 테스트 클래스에는 TestClass 특성이 있어야 하고, 모든 테스트 메서드에는 TestMethod 특성이 있어야 합니다. 자세한 내용은 단위 테스트 분석을 참조하세요.

TestClassAttribute

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

이 특성을 확장하여 동작을 업데이트하거나 확장할 수 있습니다.

예제:

[TestClass]
public class MyTestClass
{    
}

TestMethodAttribute

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

메서드는 public void 또는 public Task(선택적으로 async)로 정의된 인스턴스 메서드여야 하며 매개 변수가 없어야 합니다.

예제

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

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

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

DataRow

DataRowAttribute를 사용하면 테스트 메서드를 호출할 때 사용되는 인라인 데이터를 제공할 수 있습니다. 테스트 메서드에 한 번 또는 여러 번 표시될 수 있습니다. TestMethodAttribute 또는 DataTestMethodAttribute와 결합되어야 합니다.

인수의 수 및 형식이 테스트 메서드 서명과 정확히 일치해야 합니다.

유효한 호출의 예:

[TestClass]
public class TestClass
{
    [TestMethod]
    [DataRow(1, "message", true, 2.0)]
    public void TestMethod1(int i, string s, bool b, float f) {}
    
    [TestMethod]
    [DataRow(new string[] { "line1", "line2" })]
    public void TestMethod2(string[] lines) {}

    [TestMethod]
    [DataRow(null)]
    public void TestMethod3(object o) {}

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

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

[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" } })] In v3 onward: [DataRow(new string[] { "a" }, new string[] { "b" })]

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

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

DataRowAttribute를 상속하여 고유한 특수 데이터 행 특성을 만들 수도 있습니다.

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

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

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

다음 특성 중 하나를 사용하여 데코레이팅된 메서드는 지정하는 즉시 호출됩니다. 자세한 내용은 단위 테스트 분석을 참조하세요.

어셈블리

AssemblyInitialize는 어셈블리를 로드한 직후에 호출되고 AssemblyCleanup은 어셈블리를 언로드하기 직전에 호출됩니다.

이러한 특성으로 표시된 메서드는 TestClass에서 static void 또는 static Task로 정의되어야 하며 한 번만 표시됩니다. 초기화 부분에는 TestContext 형식의 인수 하나가 필요하고 정리 부분에는 인수가 필요하지 않습니다.

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

    [AssemblyCleanup]
    public static void AssemblyCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [AssemblyInitialize]
    public static async Task AssemblyInitialize(TestContext testContext)
    {
    }

    [AssemblyCleanup]
    public static async Task AssemblyCleanup()
    {
    }
}

클래스

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

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

클래스 클린up을 클래스의 끝이나 어셈블리의 끝에서 실행할지 여부를 구성할 수도 있습니다(EndOfClass가 기본값이자 유일한 클래스 클린up 동작이므로 MSTest v4부터 더 이상 지원되지 않음).

이러한 특성으로 표시된 메서드는 TestClass에서 static void 또는 static Task로 정의되어야 하며 한 번만 표시됩니다. 초기화 부분에는 TestContext 형식의 인수 하나가 필요하고 정리 부분에는 인수가 필요하지 않습니다.

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

    [ClassCleanup]
    public static void ClassCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [ClassInitialize]
    public static async Task ClassInitialize(TestContext testContext)
    {
    }

    [ClassCleanup]
    public static async Task ClassCleanup()
    {
    }
}

테스트

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

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

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

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

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

    [TestCleanup]
    public void TestCleanup()
    {
    }
}
[TestClass]
public class MyOtherTestClass
{
    [TestInitialize]
    public async Task TestInitialize()
    {
    }

    [TestCleanup]
    public async Task TestCleanup()
    {
    }
}

단위 테스트에서는 다양한 종류의 어설션, 예외 및 특성을 사용하여 특정 애플리케이션 동작을 확인할 수 있습니다. 자세한 내용은 Assert 클래스 사용을 참조하세요.

TestContext 클래스

다음 특성 및 해당 특성에 할당된 값은 특정 테스트 메서드에 대해 Visual Studio 속성 창에 표시됩니다. 이러한 특성은 단위 테스트의 코드를 통해 액세스할 수 없습니다. 대신 개발자가 Visual Studio의 IDE를 통해, 또는 Visual Studio 테스트 엔진이 단위 테스트를 사용하거나 실행하는 방식에 영향을 줍니다. 예를 들어, 이러한 특성 중 일부는 테스트 관리자 창과 테스트 결과 창에 열로 표시됩니다. 즉, 이러한 특성을 사용하여 테스트 및 테스트 결과를 그룹화하고 정렬할 수 있습니다. 이러한 특성 중 하나로 단위 테스트에 임의의 메타데이터를 추가하는 데 사용하는 TestPropertyAttribute가 있습니다. 예를 들어 이 특성을 사용하면 단위 테스트를 [TestProperty("TestPass", "Accessibility")]로 표시하여 이 테스트에 포함되는 “테스트 합격”의 이름을 저장할 수 있습니다. 또는 테스트의 종류를 나타내는 표시기([TestProperty("TestKind", "Localization")])를 저장하는 데 이 특성을 사용할 수 있습니다. 이 특성을 사용하여 만드는 속성과 할당하는 속성 값은 둘 다 Visual Studio 속성 창에서 테스트 특정이라는 제목 아래에 표시됩니다.

DeploymentItemAttribute

배포 항목으로 지정된 파일 또는 폴더를 배포 디렉터리에 복사하기 위해 도입된 DeploymentItemAttribute MSTest V2 프레임워크입니다(사용자 지정 출력 경로를 추가하지 않으면 복사된 파일은 프로젝트 폴더 내의 TestResults 폴더에 있음). 배포 디렉터리에는 테스트 프로젝트 DLL과 함께 모든 배포 항목이 있습니다.

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

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

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

예제

[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");
    }
}

테스트 구성 클래스

보고서 생성에 사용되는 특성

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

전용 접근자와 함께 사용되는 클래스

전용 메서드에 대한 단위 테스트를 생성할 수 있습니다. 이러한 단위 테스트 생성에서는 PrivateObject 클래스의 개체를 인스턴스화하는 전용 접근자 클래스가 만들어집니다. PrivateObject 클래스는 전용 접근자 프로세스의 일부분으로 리플렉션을 사용하는 래퍼 클래스입니다. PrivateType 클래스도 이와 유사하지만 전용 인스턴스 메서드를 호출하는 대신 전용 정적 메서드를 호출하는 데 사용됩니다.

참고 항목