Пример тестирования на основе данных на основе массива
В этом разделе рассматриваются некоторые расширенные функции тестирования на основе данных по примеру. Если вы по-прежнему охватываете основы, вам может потребоваться начать с простого примера на основе данных.
Примеры, на которые ссылается:
ArraySupportDataDrivenExample
CSharpDataDrivenArraySupportExample
В предыдущих разделах уже рассматриваются основы разработки и выполнения тестов на основе данных. В следующем списке рассматривается значение массивов в смысле тестирования на основе данных TAEF:
- Массивы — это переменная длина, однородный набор типов элементов, которые обрабатываются как один параметр.
- Чтобы указать тип массива, необходимо явно указать тип параметра в блоке ParameterTypes и добавить атрибут Array="true".
Поддерживаемые типы параметров перечислены в типах параметров в таблицах источников данных.
Если указан любой другой тип данных, тест выдает предупреждение и считает его строкой. В случае массивов тип данных считается типом String[].
В следующем примере показано, как указать, что параметр является массивом одного из основных типов. Важно отметить, что в случае массивов не разрешены типы по умолчанию. Необходимо явно указать тип и задать атрибут Array для значения true параметра.
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="ArraySupportTable">
4 <ParameterTypes>
5 <ParameterType Name="Size" Array="true">int</ParameterType>
6 <ParameterType Name="Color" Array="true">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">
14 <Value>4</Value>
15 <Value>6</Value>
16 <Value>8</Value>
17 </Parameter>
18 <Parameter Name="Color">
19 <Value>Red</Value>
20 <Value>Green</Value>
21 <Value>Blue</Value>
22 </Parameter>
23 </Row>
24 <Row>
25 <Parameter Name="Size">
26 <Value>9</Value>
27 <Value>12</Value>
28 <Value>16</Value>
29 </Parameter>
30 <Parameter Name="Color">Orange</Parameter>
31 </Row>
32 <Row>
33 <Parameter Name="Size">9</Parameter>
34 <Parameter Name="Color">
35 <Value>White</Value>
36 <Value>Black</Value>
37 </Parameter>
38 </Row>
39 </Table>
40 </Data>
Проверьте теги значения и атрибуты массива в приведенном выше примере. Во-первых, необходимо явно указать тип для параметров size и color и указать, что эти параметры являются массивами, задав атрибут Array значение true. Затем вы укажете значения в <значении...<>/Value> tags. У вас может быть столько <тегов значений> , сколько необходимо указать любое количество значений в массиве для заданного параметра Row.
Обратите внимание на строки 9, 10, 30 и 33 в примерах XML выше. Эти записи являются элементами массива с одним значением. Другими словами, можно указать элементы массива с одним значением непосредственно в теге <параметра> без дополнительного <тега value> . Кроме того, даже если параметр в строке имеет только одно значение, он по-прежнему обрабатывается как массив одного элемента и не может быть извлечен в противном случае.
Теперь ознакомьтесь с API получения.
Извлечение в собственном коде
Элементы массива можно получить в машинном коде с помощью класса шаблона WEX::TestExecution::TestDataArray<> . Дополнительные сведения см. в опубликованном заголовке TestData.h. Класс TestDataArray управляет временем существования элементов массива и предоставляет полезные API для получения определенных значений в массиве:
1 namespace WEX { namespace TestExecution
2 {
3 template <typename T>
4 class TECOMMON_API TestDataArray sealed
5 {
6 ...
7 public:
8 TestDataArray();
9 ~TestDataArray();
10 const size_t GetSize() const;
11 T& operator[](size_t index);
12
13 private:
14 ...
15 };
16 } /* namespace TestExecution */ } /* namespace WEX */
Длину массива можно получить путем вызова GetSize и получения определенного элемента с помощью оператора [].
В следующем примере показано, как использовать эти функции в коде. Рассмотрим файл cpp в собственном примере:
1 TestDataArray<int> sizes;
2 if (SUCCEEDED(TestData::TryGetValue(L"size", sizes)))
3 {
4 size_t count = sizes.GetSize();
5 for (size_t i = 0; i < count; ++i)
6 {
7 Log::Comment(String().Format(L"Size[%d] retrieved was %d", i, sizes[i]));
8 }
9 }
10
11 TestDataArray<String> colors;
12 if (SUCCEEDED(TestData::TryGetValue(L"color", colors)))
13 {
14 size_t count = colors.GetSize();
15 for (size_t i = 0; i < count; ++i)
16 {
17 Log::Comment(String().Format(L"Color[%d] retrieved was ", i) + colors[i]);
18 }
19 }
Сначала необходимо определить локальный testDataArray типа массива. В этом случае размеры — это массив типа int и цвета — это массив типа WEX::Common::String. API для получения массива аналогичен тому, который извлекает любую переменную. Вы вызываете TestData::TryGetValue, запрашиваете получение размера параметра и помещаете значение в размеры локальных переменных.
Обратите внимание, что попытка получить не массив в массив вызывает ошибку и завершается сбоем теста. Аналогичным образом попытка получить массив в переменную, отличной от массива, даже если массив имеет только один элемент, вызывает ошибку.
Если параметр массива вообще не указан в строке XML, попытка получить параметр завершается ошибкой. Например, если строка выглядела следующим образом:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Обратите внимание, что размер параметра, являющийся массивом, не указан в строке. Если вы пытаетесь получить размер из кода, вызов API вернет неудачный возвращаемый код. Это можно использовать для определения значения массива по умолчанию.
С другой стороны, можно указать пустой массив, указав пустой тег параметра для Size следующим образом:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
В этом случае попытка получить размер будет выполнена успешно, но размер массива будет равным 0.
Управляемое извлечение
Управляемое извлечение остается почти таким же, как и раньше, — необходимо получить значения в локальную переменную соответствующего типа массива. Рассмотрим следующий управляемый пример:
1 Int32[] sizes = m_testContext.DataRow["Size"] as Int32[];
2 foreach (int size in sizes)
3 {
4 Verify.AreNotEqual(size, 0);
5 Console.WriteLine("Size is " + size.ToString());
6 }
7
8 String[] colors = m_testContext.DataRow["Color"] as String[];
9 foreach (String color in colors)
10 {
11 Console.WriteLine("Color is " + color);
12 }
Аналогично собственному извлечению, если параметр массива не указан в xml-строке вообще, попытка получить параметр возвращает объект типа System.DBNull. Например, если строка выглядела следующим образом:
<Row>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
Обратите внимание, что размер параметра, являющийся массивом, не указан в строке. Если вы пытаетесь получить size из кода, вызов API вернет объект типа DBNull. Если в таблице есть такие значения, их необходимо сначала извлечь из контекста в объект и выполнить соответствующие действия после сравнения типа объекта с typeof(System.DBNull) или типа, который вы выполняете.
С другой стороны, можно указать пустой массив, указав пустой тег параметра для Size следующим образом:
<Row>
<Parameter Name="Size"></Parameter>
<Parameter Name="Color">
<Value>White</Value>
<Value>Black</Value>
</Parameter>
</Row>
В этом случае попытка получить размер succeessfully возвращает пустой массив типа System.Int32[].
Выполнения
Выполнение управляемых данными тестов, поддерживающих массивы, не отличается от выполнения других тестов на основе данных. Единственной ключевой точкой различия является то, что sematics из критериев выбора изменяется в случае параметров данных массива, чтобы означать "содержит" вместо "равно".
Чтобы узнать, что это означает, предположим, что вы хотите выбрать все тесты, управляемые данными, где массив Color содержит значение White. Для этого выполните следующую команду:
TE.exe Examples\CSharp.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
TE.exe Examples\CPP.DataDriven.Example.dll /select:"@Name='*Array* And @Data:Color='White'"
Эта команда выполняет тесты, управляемые данными, с индексом #0 и #3 в обоих из указанных выше случаев.
Можно создать более сложные запросы, например, выбрать только тест, в котором массив цветов содержит белый цвет, а массив цветов содержит черный цвет, который будет выбирать только тесты на основе данных с индексом #3. В качестве упражнения попробуйте написать и выполнить этот запрос самостоятельно.