다음을 통해 공유


여러 DataSources

여러 DataSource는 하나 이상의 DataSource(테이블 기반 DataSource, PICT 기반 DataSource 또는 WMI 기반 DataSource)의 결합 확장을 찾는 경우에 유용합니다.

이 기능을 효율적으로 사용하기 위해 테스트 디자인을 만드는 것이 가장 중요합니다. 이것이 왜 그렇게 되는지 예제의 도움으로 살펴보겠습니다. 여러 DataSource의 일부로 테이블 기반 DataSource 2개, WMI 기반 DataSource 1개, PICT 기반 DataSource 1개를 지정하려고 합니다. 인수를 위해 첫 번째 테이블에는 4개의 행이 있고, 두 번째 테이블에는 5개의 행이 있고, WMI 쿼리는 2개의 결과를 반환하고, PICT DataSource는 6개의 쌍을 이루는 조합을 생성했다고 가정해 보겠습니다. TAEF는 이러한 매개 변수 집합을 결합적으로 확장합니다. 즉, 문제의 테스트 메서드가 240번 호출됩니다(4 X 5 X 2 X 6 =). 매개 변수의 다양한 조합으로 테스트 메서드의 호출 수를 늘리면 테스트 적용 범위가 진행되는 한 결과가 감소할 수 있습니다. 따라서 여러 DataSources를 주의해서 사용하고 다른 대안을 계량하여 테스트를 디자인하는 것이 중요합니다. 다음은 고려할 수 있는 몇 가지 사항입니다.

  • 여러 테이블을 포함하는 값을 추가해야 합니다. 구분할 필요가 없는 경우 매개 변수의 효율적인 조합을 직접 생각해 볼 수 있습니다.
  • 여러 테이블 대신 제약 조건이 있는 PICT 모델 파일을 사용할 수 있는지 확인합니다.
  • 테스트 사례를 여러 테스트로 리팩터링하고 여러 DataSources의 하위 집합을 새로 만든 각 하위 테스트와 연결할 때 값이 있는지 확인합니다.

여러 DataSource 지정

여기서 중요한 측면은 DataSource를 지정하는 방법입니다. 네이티브 및 관리되는 예제의 코드 조각을 살펴보겠습니다.

네이티브

1   namespace WEX { namespace TestExecution { namespace Examples
2   {
3       class AdvancedDataDrivenTests
4       {
5           TEST_METHOD_SETUP(DataDrivenSetup);
6           TEST_METHOD_CLEANUP(DataDrivenCleanup);
7
8           TEST_CLASS(AdvancedDataDrivenTests)
9
10          BEGIN_TEST_METHOD(SecondTable)
11              TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table2;Table:CppTestLevelDataSource.xml#NestedTable")
12          END_TEST_METHOD()
13
14          BEGIN_TEST_METHOD(FirstTable)
15              TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table1;"
16                  L"PICT:PictDataSource.txt;" L"WMI:SELECT Location FROM Win32_StartupCommand")
17          END_TEST_METHOD()
18      };
19  } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

위의 예제에서는 11, 15 및 16 줄을 참조하세요. 일반적으로 DataSource를 지정하기 위해 따라야 하는 패턴은 각 DataSource 사양의 세미콜론으로 구분된 목록입니다. 이 사양은 관리 코드에서도 매우 유사합니다.

관리

[TestMethod]
[DataSource(@"Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;
    WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]

public void First()
{
    Log.Comment("In CSharpAdvancedDataDrivenTests.First");
    String[] shapes = m_testContext.DataRow["Shape"] as String[];
    foreach (String shape in shapes)
    {
        Console.WriteLine("The shape is " + shape);
    }

    Int32[] lengths = m_testContext.DataRow["Length"] as Int32[];
    foreach (int length in lengths)
    {
        Console.WriteLine("The length is " + length.ToString());
    }

    String description = (String)m_testContext.DataRow["Description"];
    Boolean desktopInteract = (Boolean)m_testContext.DataRow["DesktopInteract"];
    UInt32 processId = (UInt32)m_testContext.DataRow["ProcessId"];
    Log.Comment("Themes service is running on process " + processId.ToString());
    Log.Comment("Themes service description: " + description);
}

이 예제에서는 여러 줄에 여러 DataSource를 지정하는 방법도 보여 줍니다. 물론 아래와 같이 한 줄에 DataSource를 지정했을 수도 있지만 위에 표시된 구문을 사용하여 가독성을 크게 향상시킬 수 있습니다.

한 줄에 DataSource 지정

[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]

다시 반복 하기만 하면 각 개별 DataSource에서 생성된 데이터 집합의 n방향 결합 확장마다 테스트 메서드가 한 번 실행됩니다. 예를 들어 위의 관리되는 예제에서는 실행 중인 테마 서비스가 하나만 있고 제공된 테이블 데이터 원본에 행이 3개 있다는 것을 알면 테스트 메서드가 3번 호출됩니다(1 X 3). 네이티브 예제의 경우 SecondTable 테스트 메서드에는 두 개의 테이블 DataSource가 지정되어 있습니다. 첫 번째 테이블에는 3개의 행이 있고 두 번째 테이블에는 4개의 행이 포함됩니다. 따라서 테스트 메서드는 12번(3 X 4)으로 호출됩니다.

여러 DataSource를 지정하는 동안 적용되는 제약 조건

제약 조건은 여러 DataSource 사양에서 Table 기반 DataSource를 지정하려는 경우에만 적용됩니다. Table DataSource는 XML 파일>#<TableId>에 대한 Table:<relative 경로로 지정해야 합니다. TAEF에서 "TableId"가 별도의 메타데이터로 제공된 것을 발견하면 DataSource가 단일 테이블 기반 DataSource라고 가정하고 계속 진행합니다.