PICT 데이터 원본

이 섹션을 진행하기 전에 TAEF의 기본 실행에 익숙하고 이를 사용하여 테스트를 작성하는 방법을 알고 있는지 확인하세요.

PICT 배경 및 참조

PICT는 쌍을 이루는 독립 결합 테스트를 의미합니다. PICT를 사용하면 각 매개 변수에 대한 변형을 별도로 지정할 수 있습니다. 예를 들어 API 테스트가 FileName 및 FileExtension이라는 두 매개 변수에 의존하는 경우 다음과 같이 FileName 및 FileExtensions에 대해 전달할 수 있는 변형을 생각해 볼 수 있습니다.

  • FileName: a, z12390, Realllyreallyreallylonglonglong, normallength
  • FileExtension: txt, png, bat, doc, exe, bmp, wav

이제 목록에 추가할 더 많은 변형을 생각할 때 위의 무차별 암호 대입 결합 확장 (4 X 7 = 28)이 경계에서 쉽게 벗어날 수 있음을 알 수 있습니다. 이러한 테스트 사례 시나리오에서 PICT는 입력 매개 변수에 대한 포괄적인 결합 검사를 얻기 위해 매개 변수 결과의 압축 집합을 생성하여 많은 값을 추가할 수 있습니다.

TAEF의 PICT 지원

TAEF는 PICT 기반 테스트에 대한 기본 제공 지원을 제공합니다.

이를 활용하려면 평소처럼 pict.exe 입력 모델 파일을 작성합니다. 위에서 언급한 examples 폴더의 *.txt 파일을 참조하세요. PICT가 모델 파일에서 예상대로 실행되는 경우 먼저 다음과 같이 명령 프롬프트에서 시도하여 시도하는 것이 유용할 수 있습니다.

pict.exe <model file> [/e:<seed file>]

Pict.exe TAEF의 최신 릴리스 공유에 있는 나머지 이진 파일과 함께 사용할 수 있습니다.

PICT용 모델 파일(및 시드 파일)을 작성했으며 명령 프롬프트에서 pict.exe 대해 확인한 후에는 테스트를 표시하여 TAEF가 PICT 기반 테스트임을 알릴 수 있습니다. TAEF에서 사용할 수 있는 테이블 기반 데이터 기반 테스트에 익숙한 경우 이와 매우 유사합니다.

네이티브 코드:

1     class PictExample
2     {
3         TEST_CLASS(PictExample)
4
5         BEGIN_TEST_METHOD(SimpleTest)
6             TEST_METHOD_PROPERTY(L"DataSource", L"pict:PictExample.txt")
7         END_TEST_METHOD()
8
9         BEGIN_TEST_METHOD(TestWithSeed)
10            TEST_METHOD_PROPERTY(L"DataSource", L"pict:TestWithSeed.txt")
11            TEST_METHOD_PROPERTY(L"Pict:SeedingFile", L"TestWithSeed.sed")
12            TEST_METHOD_PROPERTY(L"Pict:Timeout", L"00:01:30")
13        END_TEST_METHOD()
14
15        BEGIN_TEST_METHOD(TestWithFunction)
16            TEST_METHOD_PROPERTY(L"DataSource", L"pict:TestWithFunction.txt")
17        END_TEST_METHOD()
18    };

관리 코드:

1     [TestClass]
2     public class CSharpPictExample
3     {
4         [TestMethod]
5         [DataSource("pict:ConstraintsTest.txt")]
6         [TestProperty("Pict:SeedingFile", "ConstraintsTest.seed")]
7         public void ConstraintsTest()
8         {
9             ...
10        }
11
12        [TestMethod]
13        [DataSource("pict:SumofSquareRoots.txt")]
14        public void SumOfSquareRoots()
15        {
16            ...
17        }
18
19        public TestContext TestContext
20        {
21            get { return m_testContext; }
22            set { m_testContext = value; }
23        }
24
25        private TestContext m_testContext;
26    }

위의 예제와 같이 모델 파일의 이름을 DataSource로 지정해야 합니다. 모델 파일의 이름 앞에 "pict:"를 접두사로 지정하고 이를 테스트 메서드의 DataSource로 제공해야 합니다. TAEF를 사용하는 다른 데이터 기반 테스트와 마찬가지로 관리되는 테스트의 경우 TestContext 속성 get 및 set 메서드를 제공하고 클래스에서 동일한 프라이빗 instance 있어야 합니다.

PICT에 명령 옵션을 전달하려는 경우 이 용도로 메타데이터를 사용할 수 있습니다. 다음 표를 사용하여 Pict.exe 명령 옵션을 TAEF 메타데이터에 매핑합니다.

pict.exe 명령 구문 네이티브 TAEF 메타데이터 구문 관리되는 TAEF 메타데이터 구문
/o:3 TEST_METHOD_PROPERTY(L"Pict:Order", L"3") [TestProperty("Pict:Order", "3")]
/D: TEST_METHOD_PROPERTY(L"Pict:ValueSeparator", L",") [TestProperty("Pict:ValueSeparator", ",")]
/a: TEST_METHOD_PROPERTY(L"Pict:AliasSeparator", L"
/N:~ TEST_METHOD_PROPERTY(L"Pict:NegativeValuePrefix", L"~") [TestProperty("Pict:NegativeValuePrefix", "~")]
/e:test.seed TEST_METHOD_PROPERTY(L"Pict:SeedingFile", L"test.seed") [TestProperty("Pict:SeedingFile", "test.seed")]
/r TEST_METHOD_PROPERTY(L"Pict:Random", L"true") [TestProperty("Pict:Random", "true")]
/r:33 TEST_METHOD_PROPERTY(L"Pict:RandomSeed", L"33") [TestProperty("Pict:RandomSeed", "33")]
/C TEST_METHOD_PROPERTY(L"Pict:CaseSensitive", L"true") [TestProperty("Pict:CaseSensitive", "true")]

위의 메타데이터는 명령 프롬프트, DataSource 속성 또는 테스트, 클래스 또는 모듈 수준 메타데이터에서 해당 순서의 우선 순위로 설정할 수 있습니다. 명령 프롬프트에서 설정하려면 구문을 사용합니다.

te.exe <test dll> /Pict:Order=3 /Pict:SeedingFile=test.seed

DataSource 속성에서 메타데이터를 설정하려면 모델 파일 이름에 물음표 문자(?)를 추가한 다음 앰퍼샌드로 구분된 메타데이터 이름 = 메타데이터 값 쌍 집합을 추가합니다. 이 메서드를 사용하는 경우 메타데이터 이름에 대한 "Pict:" 접두사는 선택 사항입니다. 예를 들면 다음과 같습니다.

TEST_METHOD_PROPERTY(L"DataSource", L"Pict:model.txt?Order=3&CaseSensitive=true&Random=true")

백그라운드에서 TAEF는 입력 모델 파일과 명령 옵션을 PICT에 제공하고 결과를 가져옵니다. PICT에서 오류 또는 경고를 생성하는 경우 TAEF에서 경고로 기록됩니다. PICT에서 생성하는 각 결과 출력 행에 대해 TAEF는 우려되는 테스트를 다시 호출합니다.

"Pict:RandomSeed" 값을 설정하면 "Pict:Random"의 기본값이 false에서 true로 변경됩니다. 이렇게 하면 명시적으로 "Pict:Random"을 false로 설정하여 TAEF가 "Pict:RandomSeed"를 무시하도록 할 수 있습니다.

PICT.exe 모델 파일 및 지정된 시드 파일 입력에서 실행할 수 있는 기본 제한 시간은 5분입니다. 모델 파일이 더 많이 관련되어 있고 PICT.exe 결과를 반환하는 데 5분 이상이 필요한 경우 "Pict:Timeout" 메타데이터를 지정하여 위의 CPP 예제와 같이 이 시간 초과를 재정의할 수 있습니다. 이 예제에서는 표준 TAEF 제한 시간 형식을 통해 1.5분 제한 시간을 지정합니다. 다른 PICT 메타데이터와 마찬가지로 "Pict:Timeout" 메타데이터가 상속되므로 전체 클래스 또는 모듈에 대해 지정할 수 있습니다.

네이티브 코드에 TestData 클래스를 사용하고 다음과 같이 관리 코드에 TestContext를 사용하여 TAEF를 사용한 테이블 기반 데이터 기반 테스트와 동일한 방식으로 테스트 메서드 및 관련 설정 및 정리 메서드에서 지정된 호출 중에 데이터 값에 액세스할 수 있습니다.

네이티브 코드:

1     void PictExample::SimpleTest()
2     {
3         String valueA;
4         if (SUCCEEDED(TestData::TryGetValue(L"A", valueA)))
5         {
6           Log::Comment(L"A retrieved was " + valueA);
7         }
8
9         String valueB;
10        if (SUCCEEDED(TestData::TryGetValue(L"B", valueB)))
11        {
12            Log::Comment(L"B retrieved was " + valueB);
13        }
14
15        String valueC;
16        if (SUCCEEDED(TestData::TryGetValue(L"C", valueC)))
17        {
18            Log::Comment(L"C retrieved was " + valueC);
19        }
20
21        unsigned int index;
22        if (SUCCEEDED(TestData::TryGetValue(L"index", index)))
23        {
24            Log::Comment(String().Format(L"At index %d", index));
25        }
26    }

관리 코드:

1      [TestClass]
2      public class CSharpPictExample
3      {
4          [TestMethod]
5          [DataSource("pict:ConstraintsTest.txt")]
6          public void ConstraintsTest()
7          {
8              Log.Comment("A is " + m_testContext.DataRow["A"]);
9              Log.Comment("B is " + m_testContext.DataRow["B"]);
10             Log.Comment("C is " + m_testContext.DataRow["C"]);
11             Log.Comment("D is " + m_testContext.DataRow["D"]);
12
13             UInt32 index = (UInt32)m_testContext.DataRow["Index"];
14             Log.Comment("At index " + index.ToString());
15        }
16
17        [TestMethod]
18        [DataSource("pict:SumofSquareRoots.txt")]
19        public void SumOfSquareRoots()
20        {
21             Log.Comment("A is " + m_testContext.DataRow["A"]);
22             Log.Comment("B is " + m_testContext.DataRow["B"]);
23
24             UInt32 index = (UInt32)m_testContext.DataRow["Index"];
25             Log.Comment("At index " + index.ToString());
26        }
27
28        public TestContext TestContext
29        {
30             get { return m_testContext; }
31             set { m_testContext = value; }
32        }
33
34        private TestContext m_testContext;
35    }

TAEF의 데이터 기반 테스트와 마찬가지로 "인덱스"는 예약되어 있으며 매개 변수 이름으로 사용하면 안 됩니다. 인덱스는 암시적으로 테스트 메서드 호출의 인덱스를 참조하며 테스트에 필요한 경우 테스트 메서드에서 액세스할 수 있습니다.

또한 PICT 기반 테스트의 경우 모든 매개 변수의 데이터 형식은 WEX::Common::String(네이티브), String(관리형) 또는 VT_BSTR(script)로 간주됩니다. 변환 및 해석은 사용자에게 남아 있습니다.

이제 TAEF를 사용하여 PICT 기반 테스트 작성을 완료했으므로 명령 프롬프트에서 호출하고 TAEF가 제공하는 모든 명령 기능을 적용할 수 있습니다. 예를 들어 /list 와 같이 PICT 출력을 데이터로 사용하여 생성되는 모든 테스트 메서드 목록을 가져오려면 /listproperties 를 사용하여 연결된 메타데이터 및 데이터 값과 함께 테스트 메서드 이름 목록을 가져올 수 있습니다. 등. 시작하기 전에 유의해야 할 중요한 점은 pict.exe 경로에 있는지 확인하는 것입니다.

다음은 몇 가지 예입니다.

te Examples\CPP.Pict.Example.dll /list /name:*SimpleTest*
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CPP.Pict.Example.dll
            WEX::TestExecution::Examples::PictExample
                WEX::TestExecution::Examples::PictExample::SimpleTest#0
                WEX::TestExecution::Examples::PictExample::SimpleTest#1
                WEX::TestExecution::Examples::PictExample::SimpleTest#2
                WEX::TestExecution::Examples::PictExample::SimpleTest#3
                WEX::TestExecution::Examples::PictExample::SimpleTest#4
                WEX::TestExecution::Examples::PictExample::SimpleTest#5
                WEX::TestExecution::Examples::PictExample::SimpleTest#6
                WEX::TestExecution::Examples::PictExample::SimpleTest#7
                WEX::TestExecution::Examples::PictExample::SimpleTest#8
                WEX::TestExecution::Examples::PictExample::SimpleTest#9
                WEX::TestExecution::Examples::PictExample::SimpleTest#10
                WEX::TestExecution::Examples::PictExample::SimpleTest#11
                WEX::TestExecution::Examples::PictExample::SimpleTest#12
                WEX::TestExecution::Examples::PictExample::SimpleTest#13
                WEX::TestExecution::Examples::PictExample::SimpleTest#14
                WEX::TestExecution::Examples::PictExample::SimpleTest#15
                WEX::TestExecution::Examples::PictExample::SimpleTest#16
                WEX::TestExecution::Examples::PictExample::SimpleTest#17
                WEX::TestExecution::Examples::PictExample::SimpleTest#18
                WEX::TestExecution::Examples::PictExample::SimpleTest#19
                WEX::TestExecution::Examples::PictExample::SimpleTest#20
                WEX::TestExecution::Examples::PictExample::SimpleTest#21
                WEX::TestExecution::Examples::PictExample::SimpleTest#22
                WEX::TestExecution::Examples::PictExample::SimpleTest#23

선택 조건(/select 및 /name)에 대한 자세한 내용은 선택 위키 페이지를 참조하세요.

te Examples\Csharp.Pict.Example.dll /listproperties /select:"@Name='*SumofSquare*'
                    and @Data:index>10
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CSharp.Pict.Example.dll
            WEX.Examples.CSharpPictExample
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#11
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 1
                        Data[b] = ~-1
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#12
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 2
                        Data[b] = ~-1

위의 예제에서는 인덱스 사용을 선택하는 방법을 보여줍니다. 데이터 값에 따라 선택하도록 선택할 수도 있습니다.

te Examples\Csharp.Pict.Example.dll /listproperties /select:"@Name='*SumofSquare*'
                    and (@Data:A='1' and @Data:B='1')"
Test Authoring and Execution Framework v2.9.3k for x86
        f:\ Examples\CSharp.Pict.Example.dll
            WEX.Examples.CSharpPictExample
                WEX.Examples.CSharpPictExample.SumOfSquareRoots#8
                        Property[DataSource] = pict:SumofSquareRoots.txt
                        Data[a] = 1
                        Data[b] = 1

PICT 결과 캐싱

일부 모델 파일은 매우 복잡해질 수 있으며 Pict.exe 처리하는 데 시간이 더 오래 필요할 수 있습니다. TAEF는 지정된 Te.exe 실행하는 동안 결과를 캐싱하여 결과의 처리 시간을 완화하려고 합니다. 동일한 실행 실행의 후속 테스트가 동일한 모델 및 시드 파일 조합을 참조하는 경우 TAEF는 캐시된 결과를 사용합니다. 기본적으로 각 실행이 끝나면 캐시된 결과가 삭제됩니다.

후속 실행에서 캐시된 결과를 계속 활용하려면 실행 중에 명령 프롬프트에서 "/persistPictResults" 옵션을 지정할 수 있습니다. 명령에 대해 "/persistPictResults"를 지정할 때마다 첫 번째 실행은 실제로 pict.exe 실행되며 시간이 오래 걸릴 수 있지만 모든 후속 실행은 모델 및 시드 파일이 수정되지 않은 경우 캐시된 결과를 사용합니다. 참고: 후속 실행에 대해 "/persistPictResults"를 계속 지정해야 합니다. 지정하지 않는 후속 실행은 해당 실행이 끝날 때 캐시된 결과를 삭제합니다.

PICT 결과를 지속하고 캐시된 데이터를 사용하는 것이 기본적으로 수행하려는 작업인 경우 아래와 같이 te_cmd 환경 변수의 일부로 설정하고 모든 실행에서 지정할 필요가 없습니다. te_cmd 대한 자세한 내용은 테스트 실행을 참조하세요.

set te_cmd = /persistPictResults

캐시된 결과 파일은 %temp% 디렉터리의 "TAEF-PICT"라는 폴더에 저장되며, Te.exe 액세스 권한이 있는 경우 또는 Te.exe 시작된 현재 실행 디렉터리에 저장됩니다. 결과가 일관되지 않은 상태일 수 있는 유일한 시간은 실행 중에 Ctrl + C를 누르는 경우입니다. 이 경우 TAEF는 캐시된 결과를 삭제하려고 시도하지만 그렇게 할 수 없는 경우 효과에 오류가 표시됩니다. 이 오류는 캐시된 결과 위치를 삭제하라는 메시지를 표시합니다. 수행하지 못하면 후속 테스트에서 정의되지 않거나 잘못된 동작이 발생할 수 있습니다.

TAEF에서 기본 제공되는 PICT 지원을 통해 이제 PICT의 기능과 테스트 자동화의 TAEF 기능을 모두 활용할 수 있습니다.

DataSource를 리소스로

테스트 모듈에서 PICT 모델 및 시드 파일을 리소스로 추가할 수 있습니다.

네이티브 코드에서는 DataSource 메타데이터에서 파일 이름 대신 리소스 이름을 지정하여 이 작업을 수행합니다. 예를 들면 다음과 같습니다.

BEGIN_TEST_METHOD(ResourceNameDataSource)
    TEST_METHOD_PROPERTY(L"DataSource", L"Pict:MyModelResourceName?SeedingFile=MySeedingResourceName")
END_TEST_METHOD()

"MyModelResourceName" 및 "MySeedingResourceName"은 .rc 파일에 정의된 리소스 이름입니다. 리소스 종류가 DATASOURCE_XML 테이블 데이터 원본과 달리 리소스 종류는 DATAFILE이어야 합니다.

MyModelResourceName DATAFILE "model.txt"
MySeedingResourceName DATAFILE "seed.txt"

DataSource 메타데이터 값은 모델이 파일일 때와 동일하게 유지됩니다. 마찬가지로 네이티브 코드에서 리소스 이름을 파일 이름과 동일하게 만들 수 있습니다. TAEF는 먼저 DataSource 이름을 사용하여 실제 파일의 존재를 찾습니다. 파일을 찾을 수 없는 경우 테스트 모듈의 리소스를 확인하여 진행합니다. 리소스에 저장된 DataSource를 변경하려면 다시 컴파일해야 하므로 개발하는 동안 DataSource 파일을 테스트 dll과 동일한 위치에 복사하고 리소스 이름을 파일 이름과 동일하게 지정하여 이 디자인을 활용할 수 있습니다. 테스트가 완료되면 파일을 코드 디렉터리로 다시 이동(복사하지 않음)하고 다시 컴파일하여 리소스를 포함합니다.