Как использовать Ceedling/Unity/Cmock для тестирования встроенных систем
Я новичок в тестировании встроенных систем с помощью ceedling. Мне было интересно, есть ли хорошее место для начала с точки зрения обучения использованию ceedling.
Проект, над которым я работаю, - это встроенная система для проекта CubeSat, и нам нужен способ протестировать наш код.
2 ответа
Первое, что вы должны понять, это то, что в первую очередь Ceedling или любая среда модульного тестирования предназначена для тестирования вашего кода и, как следствие, расширения вашего окончательного проекта. Обычно вы тестируете свой код на своем ПК, используя какой-либо компилятор на основе стандартов, не обязательно кросс-компилятор для вашей встроенной системы. Вы можете запускать тесты, сгенерированные ceedling, на целевом объекте, но, вероятно, не хотите.
Лучшая книга по этому вопросу (не идеальная, но все же чертовски хорошая) - это "Разработка через тестирование для встроенных C (прагматичные программисты)" Джеймса Греннинга.
У меня есть личный GIST по настройке под более раннюю версию Windows. В основном примечания к себе при установке Ruby и GCC в Windows.
Под Linux Ceedling очень легко настроить и запустить.
- Подтвердите, что у вас есть gcc
- Подтвердите, что у вас есть рубин с драгоценным камнем
- драгоценный камень установить ceedling
- младенец
Вот и все. Если вы адаптируетесь к новому проекту, вам нужно будет повозиться с файлом project.yml, чтобы сообщить ceedling, где находятся ваши исходные файлы и включаемые файлы, и куда вы хотите поместить ваши тестовые файлы. Это может быть сложно для некоторых структур проекта, но если все остальное не помогает, вы просто помещаете любую папку по имени в свой файл project.yml (не лучший, но идеальный вариант для сумасшедших испорченных проектов). являются своего рода волшебством, поскольку содержат ваши тесты, но также действуют как управляющий файл компоновщика. Предполагается, что каждый включаемый файл в файле test_xxx.c имеет соответствующую единицу перевода (файл.c) с тем же базовым именем. Ceedling найдет его и скомпилирует в ваш тест.Если вы хотите исключить этот код, но нуждаетесь в некоторых зависимостях, измените имя включаемого файла, чтобы включить слово mock для автоматического имитации интерфейса, поэтому foo.h станет mock_foo.h и создаст фиктивные функции для всех объявленных функций, найденных в заголовок. Если у вас нет пары имени заголовка / единицы_передачи, вы можете указать ceedling, что нужно скомпилировать и связать файл, указав его имя в макросе с именем TEST_FILE. Итак, если у вас нет foo.h, но нужен foo.c:
TEST_FILE("foo.c")
На странице Throw The Switch есть множество других замечательных ресурсов. Надеюсь, это поможет. Мне никогда не приходилось вытаскивать инструмент из github напрямую, но если вы хотите отправить им патчи, я полагаю, что это другой способ, но они приложили столько усилий, чтобы сделать его беспроблемным для установки и начала использования, я бы начал с рубина метод в первую очередь.
Боковое примечание: теперь в плагине module_generator есть несколько классных хуков для модульного тестирования, которые автоматически создают заглушки для тестирования, что может быть очень полезно во время целевых тестов.
Есть множество способов попасть в это. Я предпочитаю клонировать семяпровод (git clone https://github.com/ThrowTheSwitch/Ceedling.git && git submodule update --init --recursive
) и запустите пример, чтобы увидеть, как это работает.
Чтобы примеры / temp_sensor заработали, вам нужно внести три модификации:
- project.yml - плагины, load_paths должны быть
../../plugins
- rakefile.rb - PROJECT_CEEDLING_ROOT должен быть
"../.."
- lib/ceedling/rakefile.rb - добавить ссылку на строку
diy/test
Вот разница с модификациями, которые я сделал на мастере (git commit 09a04cb55a86):
diff --git a/examples/temp_sensor/project.yml b/examples/temp_sensor/project.yml
index ec9a45e..a327f5b 100644
--- a/examples/temp_sensor/project.yml
+++ b/examples/temp_sensor/project.yml
@@ -58,7 +58,7 @@
:plugins:
:load_paths:
- - vendor/ceedling/plugins
+ - ../../plugins
:enabled:
- stdout_pretty_tests_report
- module_generator
diff --git a/examples/temp_sensor/rakefile.rb b/examples/temp_sensor/rakefile.rb
index 1b534d2..82d2e64 100755
--- a/examples/temp_sensor/rakefile.rb
+++ b/examples/temp_sensor/rakefile.rb
@@ -1,4 +1,4 @@
-PROJECT_CEEDLING_ROOT = "vendor/ceedling"
+PROJECT_CEEDLING_ROOT = "../.."
load "#{PROJECT_CEEDLING_ROOT}/lib/ceedling.rb"
Ceedling.load_project
diff --git a/lib/ceedling/rakefile.rb b/lib/ceedling/rakefile.rb
index 37001ba..be6b620 100644
--- a/lib/ceedling/rakefile.rb
+++ b/lib/ceedling/rakefile.rb
@@ -9,6 +9,7 @@ CEEDLING_RELEASE = File.join(CEEDLING_ROOT, 'release')
$LOAD_PATH.unshift( CEEDLING_LIB )
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'unity/auto') )
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/lib') )
+$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'diy/test') )
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'cmock/lib') )
$LOAD_PATH.unshift( File.join(CEEDLING_VENDOR, 'deep_merge/lib') )
Запустите пример, запустив rake test
изнутри examples/temp_sensor
.
Для примера temp_sensor вам потребуется установить ruby (для граблей) и gcc.
После того, как вы разработали формат example/temp_sensor/rakefile.rb
а также example/temp_sensor/project.yml
файл ключевой работы находится в пределах examples/temp_sensor/test/Test...
файлы.