Источник данных PICT

Убедитесь, что вы знакомы с базовым выполнением TAEF и знаете, как создавать тесты с помощью этого раздела, прежде чем продолжить работу с этим разделом.

Предыстория и ссылки на PICT

PICT означает парное независимое комбинаторное тестирование. PICT позволяет указать варианты для каждого параметра отдельно. Например, если тест API зависит от двух параметров: ИмяФайла и РасширениеФайла, можно рассмотреть возможные варианты для ИмениФайла и РасширенияФайла отдельно следующим образом:

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

Теперь вы можете увидеть, что комбинаторное расширение методом подбора выше (4 X 7 = 28) может легко выйти за пределы по мере того как вы думаете о дополнительном добавлении вариаций в список. В таких сценариях тестов PICT может добавить много значения, создав компактный набор результатов параметров, чтобы получить комплексное комбинаторное покрытие входных параметров.

Поддержка PICT в TAEF

TAEF предлагает встроенную поддержку тестов на основе PICT.

Чтобы воспользоваться этим, напишите входной файл модели для pict.exe, как обычно. Ознакомьтесь с файлами *.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    }

Как показано в приведенных выше примерах, необходимо указать имя файла модели в качестве Источника данных. Необходимо префиксировать имя файла модели с помощью pict:, и указать его в качестве источника данных для метода тестирования. В случае управляемого теста, аналогично любому другому тесту на основе данных с помощью TAEF, необходимо предоставить свойство TestContext get и задать методы и иметь частный экземпляр одного и того же в классе.

Если вы хотите передать параметры команды в 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"Рис:НегативныйПрефиксЗначения", 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 минут. Если файл модели более сложный и требует больше времени, чем 5 минут, чтобы PICT.exe возвращать результаты, можно переопределить этот тайм-аут, как показано в приведенном выше примере на CPP, указав метаданные Pict:Timeout. В этом примере указывается время ожидания в 1,5 минуты с помощью стандартного формата времени ожидания TAEF . Как и другие метаданные PICT, метаданные "Pict:Timeout" наследуются и поэтому могут быть указаны для всего класса или модуля.

Вы можете получить доступ к значениям данных во время заданного вызова из метода тестирования и связанных с ним методов установки и очистки таким же образом, как и для тестов на основе таблиц с помощью TAEF, используя класс TestData для машинного кода и используя TestContext для управляемого кода следующим образом:

Нативный код

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 (native), String(managed) или VT_BSTR(script). Преобразование и интерпретация остаются пользователю.

Теперь, когда вы закончили разработку теста на основе PICT с помощью TAEF, вы можете вызвать его из командной строки и применить к нему все функции команд, предоставляемые 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

Кэшированные файлы результатов хранятся в папке "TAEF-PICT" в каталоге %temp%, если Te.exe имеет к нему доступ или в текущем каталоге выполнения, из которого был запущен Te.exe. Единственный раз, когда вы можете получить результаты в несогласованном состоянии, это если при выполнении вы нажмёте клавиши Ctrl+C. В таком случае TAEF попытается удалить кэшированные результаты, но если это не удастся, вам будет показано соответствующее сообщение об ошибке. Ошибка будет требовать удалить место хранения кэшированных результатов. Неспособность сделать может привести к неопределенному или ошибочному поведению в последующих тестах.

Благодаря встроенной поддержке PICT в TAEF теперь можно использовать обе функции в 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-файле. Тип ресурса должен быть DATAFILE, в отличие от источников данных таблицы , где тип ресурса должен быть DATASOURCE_XML.

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

Значение метаданных DataSource останется таким же, как и в случае с файлом модели. Аналогичным образом в машинном коде можно сделать имя ресурса таким же, как и имя файла. TAEF сначала будет искать наличие фактического файла с именем DataSource. Если файл не найден, он переходит к просмотру ресурсов тестового модуля. Так как для изменения источника данных, хранящегося в ресурсе, требуется повторная компиляция, вы можете оптимизировать этот дизайн, скопировав файл DataSource в то же расположение, что и тестовая DLL, во время разработки, и задать имя ресурса таким же, как и имя файла. После завершения тестирования переместите (не копируйте) файл обратно в каталог кода и перекомпилируйте его, чтобы внедрить ресурс.