Пример простого управляемого данными теста
В этом разделе описывается несколько примеров тестирования на основе данных и рассматриваются конкретные функции в каждом примере.
Первый пример — это базовый тест на основе данных, который называется SimpleDataDrivenExample.
В управляемом примере вы найдете XML-файл, который выглядит следующим образом:
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="Table1">
4 <ParameterTypes>
5 <ParameterType Name="Size">Int32</ParameterType>
6 <ParameterType Name="Color">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">10</Parameter>
14 <Parameter Name="Color">Black</Parameter>
15 </Row>
16 <Row>
17 <Parameter Name="Size">9</Parameter>
18 <Parameter Name="Color">Orange</Parameter>
19 </Row>
20 <Row>
21 <Parameter Name="Size">9</Parameter>
22 <Parameter Name="Color">Blue</Parameter>
23 </Row>
24 </Table>
25 </Data>
Этот XML-файл определяет параметры данных для нашего управляемого данными теста. Верхний XML-узел — это <тег Data> , который может содержать один или несколько определенных <в нем тегов таблицы> . Каждая таблица должна быть связана с уникальным атрибутом ID. Тестовые функции используют значение идентификатора таблицы для идентификации конкретной таблицы, которая будет использоваться в XML-файле.
В теге <Table> есть необязательный <раздел ParameterTypes> . Здесь можно явно указать тип данных для заданного параметра с помощью <тегов ParameterTypes> . В приведенном выше примере вы явно указываете, что параметр Size имеет тип Int32, а параметр Color является строкой. Подводя итоги, раздел ParameterTypes является необязательным. По умолчанию, если сведения о типе параметра не указаны, они будут сохранены в виде строки.
Если сравнить примеры Managed и Native, вы заметите, что единственной разницей между ними является <блок ParameterTypes> . Собственный XML-файл указывает размер для собственного целочисленного типа "int" и использует тип по умолчанию WEX::Common::String, чтобы быть типом color, не указывая его. Для удобства в следующем примере показан XML-файл из собственного примера.
1 <?xml version="1.0"?>
2 <Data>
3 <Table Id="SimpleTable">
4 <ParameterTypes>
5 <ParameterType Name="Size">int</ParameterType>
6 </ParameterTypes>
7 <Row>
8 <Parameter Name="Size">4</Parameter>
9 <Parameter Name="Color">White</Parameter>
10 </Row>
11 <Row>
12 <Parameter Name="Size">10</Parameter>
13 <Parameter Name="Color">Black</Parameter>
14 </Row>
15 <Row>
16 <Parameter Name="Size">9</Parameter>
17 <Parameter Name="Color">Orange</Parameter>
18 </Row>
19 <Row>
20 <Parameter Name="Size">9</Parameter>
21 <Parameter Name="Color">Blue</Parameter>
22 </Row>
23 </Table>
24 </Data>
Типы параметров, поддерживаемые в машинном и управляемом коде, перечислены в разделе Типы параметров в табличных источниках данных.
Если указан какой-либо другой тип данных, тест выдаст предупреждение и сочтет его строкой.
Продолжая работу с XML-файлами, после <блока ParameterTypes в обоих XML-файлах> у вас будет идентичный <набор строк>, каждый из которых соответствует одному набору данных как в управляемых, так и в собственных примерах. В этом конкретном случае у вас есть 4 набора данных, определенных с помощью 4 <блоков строк> , каждый из которых задает значения параметров с помощью <тегов Parameter> .
Здесь рассматриваются основные сведения о различных частях файла источника данных. Теперь давайте посмотрим, как получить значения, указанные в приведенном выше XML-файле.
Создание теста на основе данных
Теперь, когда данные указаны, необходимо связать код или метод теста, который будет использовать данные с данными в XML-файле. Это можно сделать как в управляемых, так и в собственных примерах, указав метаданные DataSource . Метаданные DataSource состоит из трех частей:
- "Table:" — определяет источник данных как XML-таблицу.
- "DataDrivenTests.xml" — это файл, содержащий XML-таблицу.
- "#Table2" — после делиметра "#" значение "Table2" определяет конкретную таблицу в XML-документе для использования. Один источник данных таблицы XML может содержать несколько таблиц. TAEF будет просматривать XML-файл для элемента Table с атрибутом Id, соответствующим указанному значению.
Еще раз давайте кратко рассмотрим код, охватывающий указанные выше аспекты.
Машинный код
1 class SimpleDataDrivenExample
2 {
3 BEGIN_TEST_CLASS(SimpleDataDrivenExample)
4 TEST_CLASS_PROPERTY(L"Description", L"Simple example in table-based data-driven tests")
5 END_TEST_CLASS()
6
7 TEST_METHOD_CLEANUP(TestCleanup);
8 TEST_METHOD_SETUP(TestSetup);
9
10 BEGIN_TEST_METHOD(DataDrivenTest)
11 TEST_METHOD_PROPERTY(L"DataSource", L"Table:SimpleDataDrivenExample.xml#SimpleTable")
11 END_TEST_METHOD()
12 ...
Управляемый код
1 [TestMethod]
2 [DataSource("Table:CSharpDataDrivenSimpleExample.xml#SimpleTable")]
3 public void DataDrivenTest()
4 {
5 ...
6 }
DataSource — это известное свойство в Microsoft.VisualStudio.TestTools.UnitTesting.
В дополнение к описанному выше необходимо выполнить некоторые дополнительные действия для тестов на основе данных в управляемом коде. Кроме того, необходимо определить частное свойство TestContext. Дополнительные сведения см. в разделе Класс TestContext. Вы также определяете открытые оценщики для этого свойства. Внутри TAEF задает это свойство TestContext, чтобы вы могли получить доступ к данным через него. Давайте кратко рассмотрим эту часть кода:
1 public TestContext TestContext
2 {
3 get;
4 set;
5 }
Получение данных в методе Test
API извлечения отличаются в управляемом и машинном коде. Давайте начнем с понимания собственного API извлечения:
1 void SimpleDataDrivenExample::DataDrivenTest()
2 {
3 int size;
4 if (SUCCEEDED(TestData::TryGetValue(L"size", size)))
5 {
6 VERIFY_ARE_NOT_EQUAL(size, 0);
7 Log::Comment(String().Format(L"Size retrieved was %d", size));
8 }
9
10 String color;
11 if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
12 {
13 Log::Comment(L"Size retrieved was " + color);
14 }
15
16 unsigned int index;
17 if (SUCCEEDED(TestData::TryGetValue(L"index", index)))
18 {
19 Log::Comment(String().Format(L"At index %d", index));
20 }
21 }
Обратите особое внимание на строки 4, 11 и 17. Перед каждой из этих строк определите локальную переменную для сохранения извлекаемых данных. Важно получить тип прямо здесь. Так как вы определили "Size" как тип int в XML-файле, необходимо определить локальную переменную типа int, чтобы получить ее. API извлечения принимает имя извлекаемого параметра в качестве строкового значения в качестве первого параметра. Второй параметр — это локальная переменная, передаваемая по ссылке и заданная кодом TAEF.
Этот API получения определяется в TestData.h и включается в заголовок WexTestClass.h, который включается во все тесты TAEF.
Чтобы получить данные в управляемом коде, используйте определенное свойство TestContext. Ознакомьтесь с приведенным ниже кодом (или в примере):
1 public void DataDrivenTest()
2 {
3 int size = (int)m_testContext.DataRow["Size"];
4 Verify.AreNotEqual(size, 0);
5 Log.Comment("Size is " + size.ToString());
6
7 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
8 UInt32 index = (UInt32)m_testContext.DataRow["Index"];
9 Log.Comment("At index " + index.ToString());
10 }
Если вы знакомы с VSTS, вы увидите, что приведенный выше пример аналогичен. Используйте DataRow и укажите имя столбца в качестве имени параметра, который вы пытаетесь получить.
Если посмотреть в примере, в том же классе также есть тест, не управляемый данными. Другими словами, вы можете комбинировать тесты DataDriven и NonDataDriven в одном тестовом классе.
Запуск SimpleDataDrivenExample с TAEF
Прежде чем приступать к работе с советами и рекомендациями по выполнению тестов DataDrivenTests с помощью TAEF, убедитесь, что вы знаете, как создавать тесты, управляемые данными , и выполнять тесты с помощью TAEF . Может быть полезно обновить память о том, как selection работает с TAEF.
Командная строка для выполнения управляемых данными тестов не сильно отличается от выполнения любого универсального теста с помощью TAEF. Чтобы выполнить оба примера (собственный и управляемый), описанные выше, просто выполните следующую команду:
TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple*
"/name" добавляет критерии выбора на основе имени и выбирает только интересующие вас классы. Чтобы выбрать тесты для выполнения из классов, необходимо сначала перечислить все свойства библиотеки DLL. Затем можно решить, какие свойства следует использовать для критериев выбора.
TE.exe Examples\CPP.DataDriven.Example.dll Examples\CSharp.DataDriven.Example.dll /name:*Simple* /listproperties
f:\Examples\CPP.DataDriven.Example.dll
WEX::TestExecution::Examples::SimpleDataDrivenExample
Property[Description] = Simple example in table-based data-driven tests
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#0
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = White
Data[Size] = 4
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#1
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Black
Data[Size] = 10
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#2
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Orange
Data[Size] = 9
WEX::TestExecution::Examples::SimpleDataDrivenExample::DataDrivenTest#3
Setup: TestSetup
Teardown: TestCleanup
Property[DataSource] = Table:SimpleDataDrivenExample.xml#SimpleTable
Data[Color] = Blue
Data[Size] = 9
WEX::TestExecution::Examples::SimpleDataDrivenExample::FirstNonDataDrivenTest
Setup: TestSetup
Teardown: TestCleanup
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Purple
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Maroon
WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
Setup: TestSetup
Teardown: TestCleanup
Property[Data:Color] = {Purple, Maroon, Brown}
Data[Color] = Brown
WEX::TestExecution::Examples::SimpleDataDrivenExample::SecondNonDataDrivenTest
Setup: TestSetup
Teardown: TestCleanup
f:\Examples\CSharp.DataDriven.Example.dll
WEX.Examples.CSharpDataDrivenSimpleExample
Setup: MyClassInitialize
Property[Description] = Simple example in table-based data-driven tests
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#0
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = White
Data[Size] = 4
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Black
Data[Size] = 10
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#2
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Orange
Data[Size] = 9
WEX.Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#3
Property[DataSource] = Table:CSharpDataDrivenSimpleExample.xml#SimpleTable
Data[Color] = Blue
Data[Size] = 9
WEX.Examples.CSharpDataDrivenSimpleExample.NonDataDrivenTest
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet0
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Red
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet1
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Green
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet2
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Blue
Пока давайте проигнорируем перечисленные выше значения SetsOfMetadataTest и SetsOfDataTest. Если вам интересно, ознакомьтесь с дополнительными сведениями о тестировании на основе легких данных. Теперь, когда вы знаете различные свойства, имя и значения параметра data, можно выбрать определенные тесты на их основе. Попробуйте их и следуйте инструкциям, чтобы подтвердить, что вы выбрали.
Чтобы выполнить только тесты, не управляемые данными, выполните следующую команду:
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And not(@DataSource=*)"
Теперь, чтобы выполнить только те тесты, управляемые данными, где цвет указан как "Черный", выполните следующую команду:
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Color='Black'"
Как и в случае с color, @Data:<DataDrivenParameterName>=<DataDrivenParameterValue> будет выполнять определенные данные на основе указанного значения параметра DataDriven. В приведенном выше случае он будет запускать WEX::TestExecution::Examples::SimpleDataDrivenExample::D ataDrivenTest#1 и WEX. Examples.CSharpDataDrivenSimpleExample.DataDrivenTest#1
Обратите внимание на тестовые индексы в списке свойств выше. Вы также можете выбрать указанный выше вариант на основе индекса.
TE.exe Examples\CSharp.DataDriven.Example.dll Examples\CPP.DataDriven.Example.dll /select:"@Name='*Simple*' And @Data:Index=1"
В приведенном выше примере будут выполняться те же два теста, которые @Data:Color=были выбраны как Black. Вы даже добавляете охранники к выбору индекса с помощью @Data:Index > lowerGuardValue и @Data:index< upperGuardValue
Если вы понимаете основы тестирования на основе данных с помощью TAEF, следуйте следующему классу в том же примере: Переопределение метаданных на уровне строк, Указание типов параметров массива.