Поделиться через


Пример простого управляемого данными теста

В этом разделе описывается несколько примеров тестирования на основе данных и рассматриваются конкретные функции в каждом примере.

Первый пример — это базовый тест на основе данных, который называется 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 состоит из трех частей:

  1. "Table:" — определяет источник данных как XML-таблицу.
  2. "DataDrivenTests.xml" — это файл, содержащий XML-таблицу.
  3. "#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, следуйте следующему классу в том же примере: Переопределение метаданных на уровне строк, Указание типов параметров массива.