방법: 데이터 기반 단위 테스트 만들기How To: Create a Data-Driven Unit Test

관리 코드에 Microsoft 단위 테스트 프레임워크를 사용하면 데이터 소스에서 테스트 메서드에 사용된 값을 검색하도록 단위 테스트 메서드를 설정할 수 있습니다.Using the Microsoft unit test framework for managed code, you can set up a unit test method to retrieve values used in the test method from a data source. 이 메서드는 데이터 소스의 각 행을 대상으로 연속 실행되므로 단일 메서드를 사용하여 다양한 입력을 쉽게 테스트할 수 있습니다.The method is run successively for each row in the data source, which makes it easy to test a variety of input by using a single method.

이 항목에는 다음과 같은 단원이 포함되어 있습니다.This topic contains the following sections:

  1. 테스트 메서드에서 사용할 값이 포함된 데이터 소스를 만듭니다.Create a data source that contains the values that you use in the test method. 테스트를 실행할 컴퓨터에 등록된 모든 형식을 데이터 소스로 사용할 수 있습니다.The data source can be any type that is registered on the machine that runs the test.

  2. private <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext> 필드 및 public TestContext 속성을 테스트 클래스에 추가합니다.Add a private <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext> field and a public TestContext property to the test class.

  3. 단위 테스트 메서드를 만들고 <xref:Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute> 특성을 메서드에 추가합니다.Create a unit test method and add a <xref:Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute> attribute to it.

  4. <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow%2A> 인덱서 속성을 사용하여 테스트에서 사용할 값을 검색합니다.Use the <xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow%2A> indexer property to retrieve the values that you use in a test.

테스트 중인 메서드The method under test

예를 들어 다음 항목을 만들었다고 가정해 보세요.As an example, let's assume that we have created:

  1. 다양한 형식의 계좌에 대한 트랜잭션을 수락하고 처리하는 MyBank 솔루션.A solution called MyBank that accepts and processes transactions for different types of accounts.

  2. 계좌에 대한 트랜잭션을 관리하는 MyBankBankDb 프로젝트.A project in MyBank called BankDb that manages the transactions for accounts.

  3. 모든 트랜잭션이 은행에 이로운지 확인하기 위해 수학적 함수를 실행하는 DbBank 프로젝트의 Maths 클래스.A class called Maths in the DbBank project that performs the mathematical functions to ensure that any transaction is advantageous to the bank.

  4. BankDb 구성 요소의 동작을 테스트하기 위한 BankDbTests 단위 테스트 프로젝트.A unit test project called BankDbTests to test the behavior of the BankDb component.

  5. Maths 클래스의 동작을 확인하기 위한 MathsTests 단위 테스트 클래스.A unit test class called MathsTests to verify the behavior of the Maths class.

    루프를 사용하여 두 개의 정수를 더하는 Maths의 메서드를 테스트하게 됩니다.We will test a method in Maths that adds two integers using a loop:

public int AddIntegers(int first, int second)  
{  
    int sum = first;  
    for( int i = 0; i < second; i++)  
    {  
        sum += 1;  
    }  
    return sum;  
}  

데이터 소스 만들기Creating a data source

AddIntegers 메서드를 테스트하기 위해 반환되어야 하는 매개 변수 및 합계의 값 범위를 지정하는 데이터 소스를 만듭니다.To test the AddIntegers method, we create a data source that specifies a range of values for the parameters and the sum that you expect to be returned. 이 예제에서는 MathsData Sql Compact 데이터베이스 및 다음 열 이름과 값이 포함된 AddIntegersData 테이블을 만듭니다.In our example, we create a Sql Compact database named MathsData and a table named AddIntegersData that contains the following column names and values

FirstNumberFirstNumber SecondNumberSecondNumber SumSum
00 11 11
11 11 22
22 -3-3 -1-1

테스트 클래스에 TestContext 추가Adding a TestContext to the test class

단위 테스트 프레임워크는 데이터 기반 테스트를 위해 데이터 소스 정보를 저장할 TestContext 개체를 만듭니다.The unit test framework creates a TestContext object to store the data source information for a data-driven test. 그런 다음 이 개체를 여기서 만든 TestContext 속성의 값으로 설정합니다.The framework then sets this object as the value of the TestContext property that we create.


private TestContext testContextInstance;  
public TestContext TestContext  
{  
    get { return testContextInstance; }  
    set { testContextInstance = value; }  
}  

테스트 메서드에서 TestContextDataRow 인덱서 속성을 통해 데이터에 액세스합니다.In your test method, you access the data through the DataRow indexer property of the TestContext.

테스트 메서드 작성Writing the test method

AddIntegers에 대한 테스트 메서드는 매우 간단합니다.The test method for AddIntegers is fairly simple. 데이터 소스의 각 행을 대상으로 FirstNumberSecondNumber 열 값을 매개 변수로 사용하여 AddIntegers를 호출하고 Sum 열 값에 대한 반환 값을 확인합니다.For each row in the data source, we call AddIntegers with the FirstNumber and SecondNumber column values as parameters, and we verify the return value against Sum column value:


[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0; Data Source=C:\Data\MathsData.sdf;", "Numbers")]  
[TestMethod()]  
public void AddIntegers_FromDataSourceTest()  
{  
    var target = new Maths();  

    // Access the data  
    int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);  
    int y = Convert.ToInt32(TestContext.DataRow["SecondNumber"]);   
    int expected = Convert.ToInt32(TestContext.DataRow["Sum"]);  
    int actual = target.IntegerMethod(x, y);  
    Assert.AreEqual(expected, actual,  
        "x:<{0}> y:<{1}>",  
        new object[] {x, y});  

}  

Assert 메서드에는 실패한 반복의 xy 값을 표시하는 메시지가 포함됩니다.Note that the Assert method includes a message that displays the x and y values of a failed iteration. 기본적으로 어설션된 값 expectedactual은 이미 실패한 테스트의 세부 정보에 포함되어 있습니다.By default, the asserted values, expected and actual, are already included in the details of a failed test.

DataSourceAttribute 지정Specifying the DataSourceAttribute

DataSource 특성은 테스트 메서드에 사용할 테이블의 이름 및 데이터 소스의 연결 문자열을 지정합니다.The DataSource attribute specifies the connection string for the data source and the name of the table that you use in the test method. 연결 문자열의 정확한 정보는 어떤 종류의 데이터 소스를 사용하는지에 따라 달라집니다.The exact information in the connection string differs, depending on what kind of data source you are using. 이 예제에서는 SqlServerCe 데이터베이스를 사용했습니다.In this example, we used a SqlServerCe database.

[DataSource(@"Provider=Microsoft.SqlServerCe.Client.4.0;Data Source=C:\Data\MathsData.sdf", "AddIntegersData")]  

DataSource 특성에는 세 개의 생성자가 있습니다.The DataSource attribute has three constructors.

[DataSource(dataSourceSettingName)]  

하나의 매개 변수가 있는 생성자는 솔루션에 대한 app.config 파일에 저장된 연결 정보를 사용합니다.A constructor with one parameter uses connection information that is stored in the app.config file for the solution. dataSourceSettingsName은 연결 정보를 지정하는 구성 파일의 Xml 요소 이름입니다.The dataSourceSettingsName is the name of the Xml element in the config file that specifies the connection information.

app.config 파일을 사용하면 단위 테스트 자체를 변경하지 않고 데이터 소스의 위치를 변경할 수 있습니다.Using an app.config file allows you to change the location of the data source without making changes to the unit test itself. app.config 파일을 만들고 사용하는 방법에 대한 자세한 내용은 연습: 구성 파일을 통한 데이터 소스 정의를 참조하세요.For information about how to create and use an app.config file, see Walkthrough: Using a Configuration File to Define a Data Source

[DataSource(connectionString, tableName)]  

두 개의 매개 변수가 있는 DataSource 생성자는 테스트 메서드에 대한 데이터가 포함된 테이블의 이름 및 데이터 소스의 연결 문자열을 지정합니다.The DataSource constructor with two parameters specifies the connection string for the data source and the name of the table that contains the data for the test method.

연결 문자열은 데이터 소스의 형식에 따라 달라지지만 데이터 공급자의 고정 이름을 지정하는 Provider 요소를 포함해야 합니다.The connection strings depend on the type of the type of data source, but it should contain a Provider element that specifies the invariant name of the data provider.

[DataSource(  
    dataProvider,   
    connectionString,   
    tableName,  
    dataAccessMethod  
    )]  

TestContext.DataRow를 사용하여 데이터 액세스Using TestContext.DataRow to access the data

AddIntegersData 테이블의 데이터에 액세스하려면 TestContext.DataRow 인덱서를 사용합니다.To access the data in the AddIntegersData table, use the TestContext.DataRow indexer. DataRowDataRow 개체이므로 인덱스 또는 열 이름별로 열 값을 검색합니다.DataRow is a DataRow object, so we retrieve column values by index or column names. 값은 개체로 반환되므로 값을 적절한 형식으로 변환해야 합니다.Because the values are returned as objects, we need to convert them to the appropriate type:

int x = Convert.ToInt32(TestContext.DataRow["FirstNumber"]);  

테스트 실행 및 결과 보기Running the test and viewing results

테스트 메서드 작업을 완료하면 테스트 프로젝트를 빌드합니다.When you have finished writing a test method, build the test project. 테스트 메서드는 [테스트 탐색기]에서 테스트 실행 안 함 그룹에 표시됩니다.The test method appears in the Test Explorer window in the Not Run Tests group. 테스트를 실행, 작성 및 재실행할 때 [테스트 탐색기]에는 실패한 테스트, 통과한 테스트테스트 실행 안 함 그룹에 결과가 표시됩니다.As you run, write, and rerun your tests, Test Explorer displays the results in groups of Failed Tests, Passed Tests, and Not Run Tests. 모두 실행을 선택해서 모든 테스트를 실행하거나 실행...을 선택해서 실행할 테스트 하위 집합을 선택할 수 있습니다.You can choose Run All to run all your tests, or choose Run... to choose a subset of tests to run.

테스트가 실행되면 탐색기 위쪽에 테스트 결과 표시줄에 애니메이션 효과가 적용됩니다.The test results bar at the top of the Explorer is animated as your test runs. 테스트 실행이 끝날 때 모든 테스트가 통과했으면 표시줄이 녹색이 되고 테스트가 실패하면 빨간색이 됩니다.At the end of the test run, the bar will be green if all of the tests have passed or red if any of the tests have failed. [테스트 탐색기] 창 아래쪽의 세부 정보 창에 테스트 실행의 요약이 표시됩니다.A summary of the test run appears in the details pane at the bottom of the Test Explorer window. 테스트를 선택하면 아래쪽 창에 해당 테스트의 세부 정보가 표시됩니다.Select a test to view the details of that test in the bottom pane.

예제에서 AddIntegers_FromDataSourceTest 메서드를 실행한 경우 결과 표시줄이 빨간색으로 바뀌고 테스트 메서드가 실패한 테스트로 이동합니다. 데이터 소스의 반복된 메서드가 실패하면 데이터 기반 테스트가 실패합니다.If you ran the AddIntegers_FromDataSourceTest method in our example, the results bar turns red and the test method is moved to the Failed Tests A data-driven test fails if any of the iterated methods from the data source fails. [테스트 탐색기] 창에서 실패한 테스트 기반 테스트를 선택하면 세부 정보 창에 데이터 행 인덱스별로 식별된 각 반복의 결과가 표시됩니다.When you choose a failed data-driven test in the Test Explorer window, the details pane displays the results of each iteration that is identified by the data row index. 예제에서는 AddIntegers 알고리즘이 음수 값을 제대로 처리하지 않는 것 같습니다.In our example, it appears that the AddIntegers algorithm does not handle negative values correctly.

테스트 중인 메서드가 수정되고 테스트가 다시 실행되면 결과 표시줄이 녹색으로 바뀌고 테스트 메서드가 통과한 테스트 그룹으로 이동합니다.When the method under test is corrected and the test rerun, the results bar turns green and the test method is moved to the Passed Test group.

참고 항목See Also

<xref:Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute?displayProperty=fullName><xref:Microsoft.VisualStudio.TestTools.UnitTesting.DataSourceAttribute?displayProperty=fullName>
<xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext?displayProperty=fullName><xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext?displayProperty=fullName>
<xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow%2A?displayProperty=fullName><xref:Microsoft.VisualStudio.TestTools.UnitTesting.TestContext.DataRow%2A?displayProperty=fullName>
<xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert?displayProperty=fullName><xref:Microsoft.VisualStudio.TestTools.UnitTesting.Assert?displayProperty=fullName>
단위 테스트 만들기 및 실행 How to: Create and Run a Unit Test
코드 단위 테스트 Unit Test Your Code
테스트 탐색기를 사용하여 단위 테스트 실행 Run unit tests with Test Explorer
관리 코드용 Microsoft 단위 테스트 프레임워크를 사용하여 .NET Framework용 단위 테스트 작성Writing Unit Tests for the .NET Framework with the Microsoft Unit Test Framework for Managed Code