Разработка тестов в 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, платформа не будет запускать методы тестирования класса.