Вы находитесь на странице: 1из 2

Реализовать функционал для создания резервных копий компонентов ER Control.

* компоненты ER Control - EasyRail Control Server, EasyRail Control Client,


EasyRail Dock, EasyRail Control Server Project, EasyRail Control Client Graphics
Реализовать функционал для восстановления компонентов системы из резервных копий.
Реализовать функционал для обновления компонентов системы.
Ограничить доступ к некоторым функциям паролем.
Реализовать поддержку HotStandby boards.
Реализовать кастомный просмотрщик log-файлов.
Реализовать GUI, предоставляющий доступ перечисленным выше функциям.

-----------------

В файле реализован функционал для написания юнит тестов для функций тестируемого
приложения.

Требования:
- Статистика статусов тестов.
- Переносимость на другие проекты.
- Гибкость для интегрирования в Git CI.

Общий алгоритм тестирования:


- Установить программу в определенное состояние (задать значения переменным и
полям, c которыми взаимодействует тестируемая функция).
- Вызвать тестируемую функцию.
- Проверить состояние программы после того, как тестируемая функция отработает
(сравнить состояние программы с ожидаемыми значениями).
- Сообщить результат тестирования (вывести информацию в консоль или файл, вернуть
соответствующее значение).

Так как стандартная точка входа в программу не всегда позволяет запускать из нее
тесты (например, статические и динамические библиотеки, модули embedded программ,
драйвера, службы и т.д. в принципе не могут быть запущены сами по себе), в 'e_test'
реализован функционал, создающий стандартную точку входа консольного приложения
('main' или 'wmain').

Объективно, самый удобный подход к реализации юнит тестов кода на языке C - это
создание исполняемого файла, который должен:

- установить программу в определенное состояние (путем установки значений


переменных и полей структур, которые взаимодействуют с тестируемой функцией);
- вызвать тестируемую функцию;
- проверить состояние программы после того, как тестируемая функция отработает
(сравнить состояние программы с ожидаемыми значениями);
- сообщить результат тестирования (вывести информацию в консоль или файл, вернуть
соответствующее значение).

Некоторые программы, написанные на C, не могут быть запущены сами по себе (например


динамические и статические библиотеки, драйвера, службы и т.д.). Некоторые
программы разделены на модули, которые, в свою очередь, тоже не могут быть
скомпилированы и запущены сами по себе. Также некоторые embedded-программы в
принципе предназначены не для работы на ПК. Во всех этих случаях нельзя просто
запустить программу и начать тесты.
Решение этой проблемы - подмена точки входа в программу на стандартную для
консольного приложения main (wmain) и указание компилятору и линковщику, что на
вход подается исходный код обычного консольного приложения. Подмененная точка
входа, в свою очередь, должна вызывать тесты. Всё это реализовано в файле test.h.

Использование:
В конце .c файла тестирумого модуля:
- написать #ifdef TEST_RUN, чтобы весь последующий код компилировался только при
сборке тестов;
- написать #ifdef MODULENAME_TESTS, где MODULENAME - уникальное название модуля,
который тестируется. Так как модули при юнит тестах должны быть изолированы, то для
тестирования каждого модуля будет создаваться отдельный исполняемый файл. Таким
образом, установка переменной препроцессора
- подключить файл test.h;
- написать функции для тестирования (см. пункт 3);
- написать RUN_TESTS(...), где в скобках должны быть перечислены названия тестов,
которые должны быть запущены;
- не забыть #endif для MODULENAME_TESTS и TEST_RUN.

При сборке проекта, в котором реализованы тесты с использованием разработанного


функционала:
добавить -DTEST_RUN -DMODULENAME_TESTS 1

Создание тестовых функций:


Для создания функций-тестов используется конструкция:
TEST_BEGIN([имя теста])
логика теста...
TEST_END

Фактически, имя теста - это название функции, поэтому при именовании тестов должны
соблюдаться стандарты, определенные для именования функций в языке программирования
C.

Подробнее:
Как всё устроено "под капотом" на примере следующей тестовой функции:
TESET_BEGIN(test_func_01)
EXPECT(5,5);
TEST_END

Макрос 'TEST_BEGIN(test_func_01)' разворачивается как начало определения функции


типа void:

Запуск тестов:

Вам также может понравиться