다음을 통해 공유


데이터 기반 클래스

TAEF의 기본 실행에 익숙하고 이 섹션을 진행하기 전에 이를 사용하여 테스트를 작성하는 방법을 알고 있는지 확인하세요. 간단한 데이터 기반 테스트 예제 연습도 진행할 수 있습니다. 이 섹션에서는 테이블 기반 데이터 기반 테스트를 기반으로 하는 데이터 기반 테스트 클래스를 만들지만 WMI 기반 또는 PICT 기반 데이터 기반 테스트에도 동일한 접근 방식이 적용됩니다.

데이터 기반 클래스를 사용해야 하는 경우는 언제인가요?

여러 테스트가 동일한 입력 데이터에 따라 달라질 수 있는 경우가 있습니다. API를 테스트할 때 API 동작에 대한 일관된 보기를 얻기 위해 동일한 데이터로 여러 API 테스트를 실행할 수 있습니다. 시나리오 수준 테스트를 수행할 때 시나리오의 모든 단계가 동일한 데이터로 테스트되도록 할 수 있습니다. 이때 클래스 수준에서 테스트 데이터를 지정하는 것이 유용합니다.

데이터 기반 클래스 작성

지정된 테스트가 데이터 기반임을 지정하는 방법과 비슷한 방식으로 지정된 클래스가 데이터 기반임을 지정합니다. 클래스 수준에서 DataSource 메타데이터를 적용합니다. 값은 관심 있는 특정 데이터 원본을 식별합니다. 다음 예제에서는 데이터 기반 클래스에 대해 이러한 속성을 지정하는 방법을 보여 줍니다.

네이티브 코드

1     class 2     {
2         BEGIN_TEST_CLASS(DataDrivenClassExample)
3             TEST_CLASS_PROPERTY(L"DataSource", L"Table:DataDrivenClassExample.xml#ClassTable")
4         END_TEST_CLASS()
5
6         TEST_METHOD(Test1);
7       {
8         int size;
9           if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
10          {
11              VERIFY_ARE_NOT_EQUAL(size, 0);
12              Log::Comment(String().Format(L"Size retrieved was %d", size));
13          }
14  
15          String color;
16          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
17          {
18              Log::Comment(L"Color retrieved was " + color);
19          }
20      }
21         TEST_METHOD(Test2);
22      {
23          int size;
24          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"size", size)</span>))
25          {
26              VERIFY_ARE_NOT_EQUAL(size, 0);
27              Log::Comment(String().Format(L"Size retrieved was %d", size));
28          }
29  
30          String color;
31          if (SUCCEEDED(<span class="style2">TestData::TryGetValue(L"color", color)</span>))
32          {
33              Log::Comment(L"Color retrieved was " + color);
34          }
35      } 
36    };

관리 코드

1     [TestClass]
2     public class CSharpDataDrivenClassExample
3     {
4         [ClassInitialize]
5         [DataSource("Table:CSharpDataDrivenClassExample.xml#ClassTable")]
6         public static void MyClassInitialize(Object testContext)
7         {
8         }
9
10        [TestMethod]
11        public void Test1()
12        {
13            int size = (int)m_testContext.DataRow["Size"];
14            Verify.AreNotEqual(size, 0);
15            Log.Comment("Size is " + size.ToString());
16
18            Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19        }
20
21        [TestMethod]
22        public void Test2()
23        {
24            int size = (int)m_testContext.DataRow["Size"];
25            Verify.AreNotEqual(size, 0);
26            Log.Comment("Size is " + size.ToString());
27
28            Log.Comment("Color is " + m_testContext.DataRow["Color"]);
29        }
30
31        public TestContext TestContext
32        {
33            get { return m_testContext; }
34            set { m_testContext = value; }
35        }
36
37        private TestContext m_testContext;
38    }

이러한 예제에서 네이티브 코드 예제의 줄 3과 관리 코드 예제의 줄 5는 TAEF에서 데이터 기반 테스트 클래스에 대한 데이터 원본을 지정하는 권장 방법입니다.

위의 관리 코드 예제에서 줄 13, 18, 24 및 28은 관리 코드에 대한 테스트 메서드에서 데이터를 사용할 수 있는 방법을 보여 줍니다.

다음 코드 예제에서 줄 4, 11, 20 및 27은 네이티브 코드에 대한 테스트 메서드에 데이터를 사용할 수 있는 방법을 보여 줍니다. 데이터 기반 클래스의 테이블(행)에서 정의한 데이터를 데이터 기반 테스트와 똑같은 방식으로 클래스의 테스트 메서드(Test1 및 Test2)에서 사용할 수 있도록 합니다.

데이터 기반 테스트와 정확히 동일한 방식으로 데이터 기반 클래스에 대한 DataSource XML 파일을 생성합니다. 다음 예제에서는 네이티브 및 관리되는 클래스에 대한 XML 파일을 보여 줍니다.

네이티브

1 <?xml version="1.0"?>
2 <Data>
3   <Table Id="ClassTable">
4     <ParameterTypes>
5       <ParameterType Name="Size">int</ParameterType>
6     </ParameterTypes>
7     <Row>
8       <Parameter Name="Size">4</Parameter>
9       <Parameter Name="Color">White</Parameter>
10    </Row>
11    <Row>
12      <Parameter Name="Size">10</Parameter>
13      <Parameter Name="Color">Black</Parameter>
14    </Row>
15    <Row>
16      <Parameter Name="Size">9</Parameter>
17      <Parameter Name="Color">Orange</Parameter>
18    </Row>
19    <Row>
20      <Parameter Name="Size">9</Parameter>
21      <Parameter Name="Color">Blue</Parameter>
22    </Row>
23  </Table>
24</Data>

관리

1 <?xml version="1.0"?>
2 <Data>
3   <Table Id="ClassTable">
4     <ParameterTypes>
5       <ParameterType Name="Size">Int32</ParameterType>
6       <ParameterType Name="Color">String</ParameterType>
7     </ParameterTypes>
8     <Row>
9      <Parameter Name="Size">4</Parameter>
10      <Parameter Name="Color">White</Parameter>
11    </Row>
12    <Row>
13      <Parameter Name="Size">10</Parameter>
14      <Parameter Name="Color">Black</Parameter>
15    </Row>
16    <Row>
17      <Parameter Name="Size">9</Parameter>
18      <Parameter Name="Color">Orange</Parameter>
19    </Row>
20    <Row>
21      <Parameter Name="Size">9</Parameter>
22      <Parameter Name="Color">Blue</Parameter>
23    </Row>
24  </Table>
25</Data>

비하인드 스토리 또는 무엇을 기대해야 할까요?

기본적으로 TAEF에서 테스트를 작성할 때 클래스 내의 실행 순서는 클래스에서 테스트 메서드를 코딩한 순서와 동일합니다. 따라서 이전 예제에서 Test1 은 항상 Test2 전에 실행됩니다. Test1Test2를 포함하는 클래스는 데이터 기반 클래스이므로 DataSource에서 정의한 각 데이터 ROW에 대해 모든 클래스 메서드가 한 번 실행됩니다. 즉, Test1Test2 는 행 #0에 대해 실행됩니다. 그런 다음 이러한 메서드는 TAEF가 모든 행을 실행할 때까지 행 #1에 대해 동일한 순서로 실행됩니다.

데이터 기반 클래스에서 테스트 실행

/list 명령 옵션을 사용하여 예제 테스트 이진 파일을 실행하는 경우 이전 섹션의 실행 순서가 명확해집니다.

네이티브

TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
            WEX::TestExecution::Examples::DataDrivenClassExample#0
                WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#1
                WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#2
                WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2
            WEX::TestExecution::Examples::DataDrivenClassExample#3
                WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
                WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2

관리

TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*class* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
            WEX.Examples.CSharpDataDrivenClassExample#0
                WEX.Examples.CSharpDataDrivenClassExample#0.Test1
                WEX.Examples.CSharpDataDrivenClassExample#0.Test2
            WEX.Examples.CSharpDataDrivenClassExample#1
                WEX.Examples.CSharpDataDrivenClassExample#1.Test1
                WEX.Examples.CSharpDataDrivenClassExample#1.Test2
            WEX.Examples.CSharpDataDrivenClassExample#2
                WEX.Examples.CSharpDataDrivenClassExample#2.Test1
                WEX.Examples.CSharpDataDrivenClassExample#2.Test2
            WEX.Examples.CSharpDataDrivenClassExample#3
                WEX.Examples.CSharpDataDrivenClassExample#3.Test1
                WEX.Examples.CSharpDataDrivenClassExample#3.Test2

위의 예제의 인덱스는 데이터 기반 테스트와 유사합니다. 데이터 기반 클래스의 각 행은 인덱스로 식별됩니다. 데이터 기반 테스트와 마찬가지로 XML 파일의 행 수준에서 메타데이터를 지정하고 테스트를 나열하거나 실행할 때 인덱 스 대신 해당 이름을 인쇄하여 더 의미 있는 짧은 이름을 행에 지정하도록 선택할 수 있습니다.

마찬가지로 /listproperties 옵션을 사용하여 데이터가 실제로 지정되고 클래스 수준에서 사용할 수 있는지 확인합니다.

네이티브

F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
    WEX::TestExecution::Examples::DataDrivenClassExample#0
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = White
            Data[Size] = 4
        WEX::TestExecution::Examples::DataDrivenClassExample#0::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#0::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#1
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Black
            Data[Size] = 10
        WEX::TestExecution::Examples::DataDrivenClassExample#1::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#1::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#2
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Orange
            Data[Size] = 9
        WEX::TestExecution::Examples::DataDrivenClassExample#2::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#2::Test2

    WEX::TestExecution::Examples::DataDrivenClassExample#3
            Property[DataSource] =  Table:DataDrivenClassExample.xml#ClassTable

            Data[Color] = Blue
            Data[Size] = 9
        WEX::TestExecution::Examples::DataDrivenClassExample#3::Test1
        WEX::TestExecution::Examples::DataDrivenClassExample#3::Test2

관리

F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
    WEX.Examples.CSharpDataDrivenClassExample#0
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = White
            Data[Size] = 4
        WEX.Examples.CSharpDataDrivenClassExample#0.Test1
        WEX.Examples.CSharpDataDrivenClassExample#0.Test2

    WEX.Examples.CSharpDataDrivenClassExample#1
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Black
            Data[Size] = 10
        WEX.Examples.CSharpDataDrivenClassExample#1.Test1
        WEX.Examples.CSharpDataDrivenClassExample#1.Test2

    WEX.Examples.CSharpDataDrivenClassExample#2
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Orange
            Data[Size] = 9
        WEX.Examples.CSharpDataDrivenClassExample#2.Test1
        WEX.Examples.CSharpDataDrivenClassExample#2.Test2

    WEX.Examples.CSharpDataDrivenClassExample#3
            Setup: MyClassInitialize
            Property[DataSource] =  Table:CSharpDataDrivenClassExample.xml#ClassTable

            Data[Color] = Blue
            Data[Size] = 9
        WEX.Examples.CSharpDataDrivenClassExample#3.Test1
        WEX.Examples.CSharpDataDrivenClassExample#3.Test2

데이터 기반 클래스에 모든 실행 규칙을 적용할 수 있습니다. 선택 쿼리는 /listproperties 옵션에 나열할 수 있는 모든 항목을 기반으로 할 수 있습니다.

데이터 기반 클래스의 데이터 기반 테스트

데이터 기반 클래스 내에서 데이터 기반 테스트를 수행하는 데는 어떤 식으로든 제한되지 않습니다. 이 방법은 API 테스트를 작성할 때 유용할 수 있습니다. 클래스 수준 DataSource에서 클래스의 모든 테스트에 대한 공통 데이터를 유지할 수 있습니다. 데이터 기반로 표시하는 메서드에 대한 DataSource 메타데이터에 특정한 테스트 메서드인 데이터를 지정합니다.

참고: 이러한 경우 실행 순서가 좀 더 복잡합니다.

다음 예제에서는 이전 두 이진 파일이 /list 명령 옵션을 사용하여 렌더링하는 방법을 보여 줍니다.

네이티브

TE.exe Examples\CPP.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CPP.AdvancedDataDriven.Examples.dll
            WEX::TestExecution::Examples::NestedDataDrivenExample#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#0::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#1::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#2::Test2#3
            WEX::TestExecution::Examples::NestedDataDrivenExample#3
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test1
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#0
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#1
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#2
                WEX::TestExecution::Examples::NestedDataDrivenExample#3::Test2#3

관리

TE.exe Examples\CSharp.AdvancedDataDriven.Examples.dll /name:*nested* /list
Test Authoring and Execution Framework v2.9.3k for x86

        F:\ Examples\CSharp.AdvancedDataDriven.Examples.dll
            WEX.Examples.CSharpDataDrivenNestedExample#0
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#0.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#1.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#2
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#2.Test2#3
            WEX.Examples.CSharpDataDrivenNestedExample#3
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test1
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#0
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#1
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#2
                WEX.Examples.CSharpDataDrivenNestedExample#3.Test2#3

참고: 이 경우 유일한 제한 사항은 두 예제의 테이블이 동일한 DataSource 파일에 있을 수 없다는 것입니다. 즉, 데이터 기반 클래스에 대한 DataSource 및 데이터 기반 테스트 메서드가 포함되어 있어야 합니다.

예제의 Test2 메서드는 데이터 기반 클래스 내의 데이터 기반 테스트입니다. 예를 들어 줄 WEX에서 입니다. Examples.CSharpDataDrivenNestedExample#3.Test2#0, #3 은 클래스의 인덱스이고 #0 은 해당 클래스 내의 데이터 기반 테스트에 대한 인덱스입니다. Test2는 두 테이블에 모두 액세스할 수 있습니다. 즉, 클래스의 행에 속한 instance 데이터와 자체 DataSource 테이블의 현재 행에 있는 데이터입니다. 즉, 클래스 수준의 데이터와 테스트 메서드 수준의 데이터가 함께 집계되고 테스트 메서드 실행 중에 사용할 수 있습니다.

동일한 데이터 이름이 클래스 수준과 메서드 수준에서 모두 지정된 경우 데이터가 충돌하는 경우 어떻게 되나요? TAEF는 메타데이터 속성을 처리하는 것과 동일한 방식으로 이 조건을 처리합니다. 메서드 수준의 행에 지정된 데이터는 클래스 수준의 행에 지정된 데이터를 재정의합니다.

예를 들어 클래스 수준과 테스트 메서드 수준에서 모두 지정된 Size 라는 매개 변수가 있는 경우를 고려합니다. 클래스 수준에서 Size문자열 배열 형식으로 정의되지만 테스트 메서드 수준에서 int로 정의됩니다. 이 경우 int 형식은 테스트 메서드 수준과 테스트에 대한 SetupTeardown 메서드에서 문자열 배열 형식을 재정의합니다. 그러나 클래스 수준의 SetupTeardown 메서드에서 Size 에는 문자열 배열 데이터 형식이 있습니다.

코드에 충돌하는 데이터가 있는 경우 TAEF는 실행 중에 경고를 표시하고 속성을 나열하지만 충돌하는 데이터가 실패하지는 않습니다.