다음을 통해 공유


여러 데이터 소스

여러 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는 Table:<XML 파일에 대한 상대 경로>#<TableId>로 정해야 합니다. TAEF에서 "TableId"가 별도의 메타데이터로 제공된 것을 발견하면 DataSource가 단일 테이블 기반 DataSource라고 가정하고 계속 진행합니다.