Я хотел бы иметь возможность модульного тестирования моего кода Arduino. В идеале я мог бы запускать любые тесты, не загружая код в Arduino. Какие инструменты или библиотеки могут помочь мне с этим?
В разработке находится эмулятор Arduino, который может быть полезен, но пока еще не готов к использованию.
AVR Studio от Atmel содержит симулятор микросхемы, который может быть полезен, но я не понимаю, как бы я использовал его в сочетании с IDE Arduino.
Ответы:
Не запускайте юнит-тесты на устройстве Arduino или эмуляторе
Дело против микроконтроллера устройства / эмулятора / сим-тестов
Целью модульного тестирования является проверка качества вашего собственного кода. Модульные тесты, как правило, никогда не должны проверять функциональность факторов вне вашего контроля.
Подумайте об этом так: даже если бы вы тестировали функциональность библиотеки Arduino, аппаратного обеспечения микроконтроллера или эмулятора, результаты такого теста абсолютно не могли бы вам ничего сказать о качестве вашей собственной работы. Следовательно, гораздо более ценно и эффективно писать модульные тесты, которые не запускаются на целевом устройстве (или эмуляторе).
Частое тестирование на целевом оборудовании имеет чрезвычайно медленный цикл:
Шаг 3 особенно неприятен, если вы ожидаете получать диагностические сообщения через последовательный порт, но сам ваш проект должен использовать единственный аппаратный последовательный порт вашего Arduino. Если вы думали, что библиотека SoftwareSerial может помочь, вы должны знать, что это может нарушить любую функциональность, которая требует точной синхронизации, например, генерация других сигналов одновременно. Эта проблема произошла со мной.
Опять же, если вы должны были протестировать свой эскиз с помощью эмулятора, и ваши подпрограммы, критичные ко времени, выполнялись идеально, пока вы не загрузили его в реальный Arduino, то единственный урок, который вы собираетесь извлечь, это то, что эмулятор имеет недостатки - и зная об этом до сих пор ничего не говорит о качестве вашей работы.
Если это глупо тест на устройстве или эмуляторе, что нужно делать?
Вы, вероятно, используете компьютер для работы над проектом Arduino. Этот компьютер на несколько порядков быстрее, чем микроконтроллер. Напишите тесты для сборки и запуска на вашем компьютере .
Помните, что поведение библиотеки Arduino и микроконтроллера следует считать правильным или, по крайней мере, постоянно неправильным .
Если ваши тесты дают результат, противоречащий вашим ожиданиям, то, скорее всего, у вас есть недостаток в тестируемом коде. Если результаты теста соответствуют вашим ожиданиям, но программа не работает должным образом, когда вы загружаете его в Arduino, тогда вы знаете, что ваши тесты основывались на неверных допущениях, и вы, вероятно, имеете ошибочный тест. В любом случае вам будет дано реальное представление о том, какими должны быть ваши следующие изменения кода. Качество ваших отзывов улучшено с « что-то сломано» до «этот конкретный код сломан» .
Как создавать и запускать тесты на вашем ПК
Первое, что вам нужно сделать, это определить ваши цели тестирования . Подумайте о том, какие части вашего собственного кода вы хотите протестировать, а затем убедитесь, что ваша программа построена таким образом, что вы можете изолировать отдельные части для тестирования.
Если части, которые вы хотите протестировать, вызывают какие-либо функции Arduino, вам нужно будет предоставить макетные замены в вашей тестовой программе. Это гораздо меньше работы, чем кажется. Ваши макеты не должны ничего делать, кроме обеспечения предсказуемого ввода и вывода для ваших тестов.
Любой ваш собственный код, который вы собираетесь тестировать, должен существовать в исходных файлах, отличных от эскиза .pde. Не волнуйтесь, ваш эскиз все равно будет компилироваться даже с некоторым исходным кодом за пределами эскиза. Когда вы действительно приступите к этому, в файле эскиза должно быть определено немного больше, чем обычная точка входа вашей программы.
Осталось только написать настоящие тесты, а затем скомпилировать их, используя ваш любимый компилятор C ++! Это, вероятно, лучше всего иллюстрируется на примере реального мира.
Фактический рабочий пример
Один из моих любимых проектов, найденных здесь, имеет несколько простых тестов, которые выполняются на ПК. Для этого ответа я просто расскажу, как я смоделировал некоторые функции библиотеки Arduino и тесты, которые я написал, чтобы проверить эти макеты. Это не противоречит тому, что я говорил ранее о не тестировании кода других людей, потому что я был тем, кто написал макеты. Я хотел быть уверен, что мои макеты были правильными.
Источник mock_arduino.cpp, который содержит код, который дублирует некоторые функции поддержки, предоставляемые библиотекой Arduino:
Я использую следующий макет для создания читабельного вывода, когда мой код записывает двоичные данные на аппаратное последовательное устройство.
fake_serial.h
fake_serial.cpp
и, наконец, актуальная тестовая программа:
Этот пост достаточно длинный, поэтому, пожалуйста, обратитесь к моему проекту на GitHub, чтобы увидеть еще несколько тестов в действии. Я продолжаю свои работы в других ветках, кроме master, так что проверяйте эти ветки и на дополнительные тесты.
Я решил написать свои собственные легкие процедуры тестирования, но также доступны более надежные платформы модульных тестов, такие как CppUnit.
источник
В отсутствие каких-либо ранее существовавших модульных тестовых сред для Arduino я создал ArduinoUnit . Вот простой эскиз Arduino, демонстрирующий его использование:
источник
У меня есть значительный успех, когда я тестирую мой код PIC, абстрагируя аппаратный доступ и высмеивая его в своих тестах.
Например, я абстрагирую PORTA с помощью
Тогда SetPortA можно легко смоделировать, не добавляя служебный код в версию PIC.
Как только аппаратная абстракция была протестирована, я вскоре обнаружил, что, как правило, код переходит с испытательного стенда на PIC и работает впервые.
Обновить:
Я использую шов #include для кода модуля, # включая код модуля в файле C ++ для тестовой установки и файл C для целевого кода.
В качестве примера я хочу мультиплексировать четыре 7-сегментных дисплея, один порт управляет сегментами, а второй выбирает дисплей. Код дисплея взаимодействует с дисплеями через
SetSegmentData(char)
иSetDisplay(char)
. Я могу смоделировать их на своем тестовом стенде C ++ и проверить, получаю ли я ожидаемые данные. Для цели, которую я использую,#define
чтобы получить прямое назначение без издержек на вызов функцииисточник
Кажется, что Эмулино отлично справился бы с этой работой.
GitHub хранилище
источник
Симавр это симулятор AVR с использованием avr-gcc.
Он уже поддерживает несколько микроконтроллеров ATTiny и ATMega, и, по словам автора, легко добавить еще несколько.
В примерах лежит simduino, эмулятор Arduino. Он поддерживает запуск загрузчика Arduino и может быть запрограммирован с помощью avrdude через Socat (модифицированный Netcat ).
источник
Вы можете выполнить юнит-тестирование на Python с моим проектом PySimAVR . Arscons используется для построения и simavr для моделирования.
Пример:
Начать тестирование:
источник
Я не знаю ни одной платформы, которая может тестировать код Arduino.
Тем не менее, существует платформа Fritzing , которую вы можете использовать для моделирования оборудования, а затем для экспорта диаграмм печатных плат и прочего.
Стоит проверить.
источник
Мы используем платы Arduino для сбора данных в большом научном эксперименте. Впоследствии мы должны поддерживать несколько плат Arduino с различными реализациями. Я написал утилиты Python для динамической загрузки шестнадцатеричных изображений Arduino во время модульного тестирования. Код, найденный по ссылке ниже, поддерживает Windows и Mac OS X через файл конфигурации. Чтобы узнать, где ваши шестнадцатеричные изображения размещены в Arduino IDE, нажмите клавишу Shift, прежде чем нажать кнопку «Сборка (воспроизведение)». Нажмите клавишу Shift во время загрузки, чтобы узнать, где находится ваша avrdude (утилита загрузки из командной строки) в вашей системе / версии Arduino. Кроме того, вы можете посмотреть включенные файлы конфигурации и использовать место установки (в настоящее время на Arduino 0020).
http://github.com/toddstavish/Python-Arduino-Unit-Testing
источник
Эта программа позволяет автоматически запускать несколько юнит-тестов Arduino. Процесс тестирования запускается на ПК, но тесты выполняются на реальном оборудовании Arduino. Один набор модульных тестов обычно используется для тестирования одной библиотеки Arduino. (этот
Форум Arduino: http://arduino.cc/forum/index.php?topic=140027.0
Страница проекта GitHub: http://jeroendoggen.github.com/Arduino-TestSuite
Страница в индексе пакетов Python: http://pypi.python.org/pypi/arduino_testsuite
Модульные тесты написаны с помощью "библиотеки модульных тестов Arduino": http://code.google.com/p/arduinounit
Следующие шаги выполняются для каждого набора модульных тестов:
источник
Держите аппаратно-зависимый код отдельно или абстрагировано от остальных, чтобы вы могли тестировать и отлаживать этот больший «отдых» на любой платформе, для которой у вас есть хорошие инструменты и с которой вы больше всего знакомы.
По сути, постарайтесь собрать как можно больше окончательного кода из максимально возможного количества известных строительных блоков. Остальная аппаратно-зависимая работа будет намного проще и быстрее. Вы можете закончить это, используя существующие эмуляторы и / или эмулирующие устройства самостоятельно. И тогда, конечно, вам нужно как-то проверить реальную вещь. В зависимости от обстоятельств, это может или не может быть очень хорошо автоматизируемым (то есть кто или что будет нажимать кнопки и предоставлять другие входные данные? Кто или что будет наблюдать и интерпретировать различные индикаторы и выходные данные?).
источник
Джеймс У. Греннинг пишет большие книги , и это одна о модульном тестировании встроенного C кода Test Driven Development для встраиваемого C .
источник
Я использую Searduino при написании кода Arduino. Searduino - это симулятор Arduino и среда разработки (Makefiles, C code ...), которые позволяют легко взламывать C / C ++ с помощью вашего любимого редактора. Вы можете импортировать эскизы Arduino и запускать их в симуляторе.
Снимок экрана Searduino 0.8: http://searduino.files.wordpress.com/2014/01/jearduino-0-8.png
Searduino 0.9 будет выпущен, и видео будет записано, как только будут проведены последние тесты .... через день или два.
Тестирование на симуляторе не следует рассматривать как реальные тесты, но оно, безусловно, очень помогло мне в поиске глупых / логических ошибок (забыв сделать
pinMode(xx, OUTPUT)
и т.д.).Кстати, я один из тех, кто разрабатывает Searduino.
источник
Я построил
arduino_ci
для этого. Хотя он ограничивается тестированием библиотек Arduino (а не отдельных набросков), он позволяет запускать модульные тесты либо локально, либо в системе CI (например, Travis CI или Appveyor).Рассмотрим очень простую библиотеку в директории Arduino библиотеки, называется
DoSomething
, сdo-something.cpp
:Вы бы протестировали его следующим образом (с вызванным тестовым файлом
test/is_four.cpp
или чем-то подобным):Вот и все. Если этот
assertEqual
синтаксис и структура теста выглядят знакомыми, то это потому, что я принял библиотеку Мэтью Мердока ArduinoUnit, на которую он ссылался в своем ответе .См. Reference.md для получения дополнительной информации о модульном тестировании выводов ввода / вывода, синхронизации, последовательных портов и т. Д.
Эти модульные тесты компилируются и запускаются с использованием скрипта, содержащегося в геме ruby. Для примеров того, как установить это, посмотрите README.md или просто скопируйте из одного из этих примеров:
источник
Есть проект под названием ncore , который предоставляет родное ядро для Arduino. И позволяет писать тесты для кода Arduino.
Из описания проекта
Также в разделе «что мне нужно использовать»
источник
Если вы хотите выполнить модульное тестирование кода вне MCU (на рабочем столе), проверьте libcheck: https://libcheck.github.io/check/
Я использовал его для тестирования своего встроенного кода несколько раз. Это довольно надежная структура.
источник
Вы можете использовать emulare - вы можете перетащить микроконтроллер на диаграмму и запустить свой код в Eclipse. В документации на сайте рассказывается, как ее настроить.
источник
Используйте Proteus VSM с библиотекой Arduino для отладки вашего кода или его тестирования.
Лучше всего перед тем, как получить свой код на борту, но будьте уверены в сроках, потому что симуляция не выполняется в реальном времени, как они работают на плате.
источник
Попробуйте Autodesk Circuit Simulator . Это позволяет тестировать код Arduino и схемы со многими другими аппаратными компонентами.
источник
В основном Arduino написан на C и C ++, даже библиотеки Arduino написаны на C и C ++. Итак, в простых терминах просто обработайте код как C и C ++ и попробуйте выполнить модульное тестирование. Здесь под словом «дескриптор» я подразумеваю, чтобы вы изменили весь основной синтаксис, такой как serial.println, на sysout, pinmode на varaibles, void loop to while (), который прерывается либо в keystock, либо после некоторой итерации.
Я знаю, что это немного долгий процесс, и он не так прост. На моем личном опыте, как только вы это сделаете, это окажется более надежным.
-Nandha_Frost
источник
Если вы заинтересованы в запуске эскиза INO и проверке последовательного вывода, у меня есть рабочая реализация этого в моей контрольной сумме Arduino NMEA проекте .
Следующий скрипт берет файл и использует Arduino CLI для компиляции его в HEX-файл, который затем загружается в SimAVR, который оценивает его и печатает последовательный вывод. Так как все программы Arduino работают вечно, не имея возможности убить себя (
exit(0)
не работает), я позволил скетчу запустить несколько секунд, а затем показал полученный результат с ожидаемым результатом.Загрузите и извлеките Arduino CLI (в данном случае версия 0.5.0 - последняя на момент написания):
Теперь вы можете обновить индекс и установить соответствующее ядро:
Предполагая, что ваш эскиз назван
nmea-checksum.ino
, чтобы получить ELF и HEX, запустите:Далее, SimAVR для запуска HEX (или ELF) - я собираю из исходного кода, потому что последний выпуск не работал для меня:
Успешная компиляция даст вам,
simavr/run_avr
что вы можете использовать для запуска эскиза. Как я уже сказал,timeout
это никогда не закончитсяСгенерированный файл будет содержать управляющие символы кода цвета ANSI, заключающие последовательный вывод, чтобы избавиться от них:
Теперь все, что вам нужно сделать, это сравнить этот файл с известным хорошим файлом:
Если различий нет,
diff
выйдет с кодом 0, иначе скрипт не выполнится.источник