Как использовать Ceedling / Unity / Cmock для тестирования встроенных систем - PullRequest
0 голосов
/ 11 февраля 2020

Я новичок в тестировании встроенных систем с ceedling. Мне было интересно, есть ли хорошее место, чтобы начать с точки зрения изучения, как использовать саженцы.

Проект, над которым я работаю, это встроенная система для проекта CubeSat, и нам нужен способ протестировать наш код.

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

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

Лучшей книгой по этому предмету (не идеальной, но все же чертовски хорошей) является Джеймс У. Разработка Grenning для разработки встраиваемых приложений для встраиваемых систем C (Pragmati c Programmers).

У меня есть личный GIST при настройке под более старым Windows здесь . В основном я обращаю внимание на то, что Ruby и G CC на windows.

Под Linux Ceedling очень прост в настройке и запуске.

  1. подтвердите, что у вас есть g cc доступно
  2. подтвердите, что у вас есть ruby с драгоценным камнем
  3. драгоценный камень при установке ceedling
  4. ceedling

Вот и все. Если вы адаптируетесь к новому проекту, вам нужно будет покопаться в файле project.yml, чтобы сообщить ceedling, где находятся ваши исходные файлы и включаемые файлы, и где вы хотите, чтобы ваши тестовые файлы имели значение go. Это может быть сложной задачей для некоторых структур проекта, но если ничего не помогает, вы просто помещаете когда-либо папку по имени в свой файл project.yml (не самый лучший, но в конечном итоге запасной вариант для сумасшедших испорченных проектов). Существуют другие вещи, связанные с обучением, такие как ceedling test_xxx. c файлы являются своего рода магией c в том смысле, что они содержат ваши тесты, но также действуют как контрольный файл компоновщика. Предполагается, что каждый включаемый файл в файле test_xxx. c имеет соответствующую единицу перевода (файл. c) с тем же базовым именем. Ceedling найдет его и скомпилирует в ваш тест. Если вы хотите исключить этот код, но нуждаетесь в некоторых зависимостях, измените имя включаемого файла, включив в него слово mock, чтобы автоматически смоделировать интерфейс, чтобы foo.h стал mock_foo.h и создавал фиктивные функции для всех объявленных функций, найденных в заголовок. Если у вас нет пары имен header / tranalation_unit, вы можете сказать ceedling скомпилировать и связать файл, поместив его имя в макрос с именем TEST_FILE. Так что если у вас нет foo.h, но вам нужен foo. c:

TEST_FILE("foo.c")

На странице Throw The Switch есть множество других замечательных ресурсов. Надеюсь, это поможет. Мне никогда не приходилось извлекать инструмент непосредственно из github, но если вы хотите отправить им исправления, я полагаю, что это другой способ, но они вложили так много усилий, чтобы сделать его более простым в настройке и начать использовать, я бы начал с * Сначала метод 1047 *.

Примечание: в плагине module_generator теперь есть несколько классных хуков для юнит-тестирования, которые автоматически генерируют заглушки для тестирования, что может быть очень полезно во время целевых тестов.

0 голосов
/ 14 февраля 2020

Есть множество способов попасть в него. Я предпочитаю клонировать ceedling (git clone https://github.com/ThrowTheSwitch/Ceedling.git && git submodule update --init --recursive) и запустить пример, чтобы увидеть, как он работает.

Чтобы заставить examples / 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.

Вам нужно ruby (для граблей) и g cc для примера temp_sensor.

После того, как вы отработаете формат example/temp_sensor/rakefile.rb и example/temp_sensor/project.yml файл, ключ работы находится в examples/temp_sensor/test/Test... файлах.

...