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


Разработка тестов в C++

В следующем примере кода показан собственный файл C++, содержащий один тестовый класс с двумя методами тестирования.

1   #include "WexTestClass.h"
2
3   class SimpleTests   {
4      // Declare this class as a TestClass, and supply metadata if necessary.
5      TEST_CLASS(SimpleTests);
6
7      // Declare the tests within this class.
8      TEST_METHOD(FirstTest);
9      TEST_METHOD(SecondTest);
10  };
11
12  void SimpleTests::FirstTest()
13  {
14      VERIFY_ARE_EQUAL(1, 1);
15  }
16
17  void SimpleTests::SecondTest()
18  {
19      VERIFY_IS_TRUE(true);
20  }

Строка 1 содержит один файл заголовка, необходимый для платформы WexTestClass.h, найденный по адресу %\Program Files (x86)\Windows Kits\10\Testing\Development\inc. Этот файл также включает файл Log.h для средства ведения журнала и файла Verify.h для определения случаев проверки. Эти файлы заголовков будут рассмотрены позже.

Строка 3 определяет тестовый класс SimpleTests. Тестовые классы не должны наследоваться от какого-либо специального класса. Кроме того, их содержимое не должно быть общедоступным.

Строка 5 определяет этот класс как тестовый класс.

Строки 8 и 9 объявляют два метода теста в классе FirstTest и SecondTest. Они определены в строках 12–20. Макрос TEST_METHOD добавляет требуемое объявление метода в класс. В этой схеме разметки все тесты должны иметь один прототип. Они должны возвращать void, и они не должны принимать параметры.

Если вы хотите определить встроенные тесты в объявлении класса, это можно сделать до тех пор, пока вы включаете WexTestClass.h, а INLINE_TEST_METHOD_MARKUP определен в препроцессоре.

1   #define INLINE_TEST_METHOD_MARKUP
2   #include "WexTestClass.h"
3
4   class InlineTests
5   {
6       TEST_CLASS(InlineTests);
7 
8       TEST_METHOD(FirstTest)
9       {
10          VERIFY_ARE_EQUAL(1, 1);
11      }
12
13      TEST_METHOD(SecondTest)
14      {
15          VERIFY_IS_TRUE(true);
16      }
17  };

Строки 10 и 15 теперь содержат определения методов тестирования.

Обратите внимание , что если объявление тестового класса помещается в файл заголовка, рекомендуется включить только этот файл заголовка в один файл cpp. Включение объявления тестового класса в несколько файлов CPP приводит к компиляции дополнительных данных в тестовую библиотеку DLL.

Расширенные тесты разработки в C++

В следующем примере используются методы установки и очистки и объявляется метаданные вместе с объявлениями тестового класса и метода тестирования. В этом примере также содержится один класс (MetadataAndFixturesTests) с двумя методами тестирования.

 1  #define INLINE_TEST_METHOD_MARKUP
 2  #include "WexTestClass.h"
 3
 4  BEGIN_MODULE()
 5      MODULE_PROPERTY(L"Feature", L"TAEF")
 6  END_MODULE()
 7
 8  MODULE_SETUP(ModuleSetup)
 9  {
10      return true;
11  }
12
13  MODULE_CLEANUP(ModuleCleanup)
14  {
15      return true;
16  }
17
18  class MetadataAndFixturesTests
19  {
20      BEGIN_TEST_CLASS(MetadataAndFixturesTests)
21          TEST_CLASS_PROPERTY(L"Component", L"Verify")
22      END_TEST_CLASS()
23
24      TEST_CLASS_SETUP(ClassSetup)
25      {
26          return true;
27      }
28
29      TEST_CLASS_CLEANUP(ClassCleanup)
30      {
31          return true;
32      }
33
34      TEST_METHOD_SETUP(TestSetup)
35      {
36          return true;
37      }
38
39      TEST_METHOD_CLEANUP(TestCleanup)
40      {
41          return true;
42      }
43
44      // If you use this syntax, you will have to define the test outside of the test class.
45      BEGIN_TEST_METHOD(FirstTest)
46          TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
47      END_TEST_METHOD()
48
49      // You can still have metadata even if you define your test inside the test class.
50      TEST_METHOD(SecondTest)
51      {
52          BEGIN_TEST_METHOD_PROPERTIES()
53              TEST_METHOD_PROPERTY(L"Owner", L"Contoso")
54          END_TEST_METHOD_PROPERTIES()
55
56          VERIFY_IS_TRUE(true);
57      }
58  };
59
60  void MetadataAndFixturesTests::FirstTest()
61  {
62      VERIFY_ARE_EQUAL(1, 1);
63  }

Строка 4 начинает объявление глобальных метаданных, набор свойств, применяемых к тестовому двоичному файлу, для которого компилируется этот заголовок.

Строка 5 объявляет свойство с именем Feature и значением TAEF. Между BEGIN может быть более одного свойства... и END... Макросы. Аналогичные объявления свойств существуют в строках 20-24 (метаданные уровня класса), 45-47 (метаданные уровня метода) и 52-54 (метаданные уровня теста в тесте, определенном в встроенном коде).

Строки 45 – 47 и 60 – 63 демонстрируют эти макросы теста для добавления метаданных также объявляют методы тестирования. Строки 50 – 57 демонстрируют, что метаданные по-прежнему доступны, даже если вы хотите объявить и определить тест в том же расположении.

Строка 8 объявляет функцию установки модуля — функцию, которая выполняется перед созданием любого тестового класса модуля.

Строка 13 объявляет функцию очистки модуля — функцию, которая выполняется после выполнения всех тестов и методов очистки класса и деструкторов. Существуют аналогичные методы установки и очистки для класса в строках 24, хотя 32. Эти методы выполняются после конструктора класса и перед деструктором класса соответственно.

Строки 34–42 объявляют аналогичные функции для методов тестирования. Тестовые методы установки и очистки выполняются до и после каждого выполнения теста.

Методы настройки и очистки TAEF возвращают логическое значение и не принимают параметров. Возвращаемое значение сигнализирует платформе о том, может ли он продолжать выполнять тесты для определенного тестового модуля. Например, если метод установки класса завершается ошибкой и возвращает значение false, платформа не будет запускать методы тестирования класса.