Как можно автоматически тестировать исходный код Arduino (непрерывная интеграция)?

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

, 👍18

Обсуждение

Кроме передачи через Ino и avr-size?, @Ignacio Vazquez-Abrams

@IgnacioVazquez-Abrams Я не против, какие инструменты использовать, но они должны автоматически запускаться на каком-нибудь облачном хостинге или в службе непрерывной интеграции., @Jakob

Компилировать двоичный размер не так уж сложно, но для выполнения модульных тестов вам придется структурировать свой код таким образом, чтобы его можно было тестировать по модулям, а это достаточно сложно, если вы хотите сохранить небольшой размер. Кроме того, вам нужно будет запустить этот тест на чипе или в эмуляторе, чтобы получить более или менее надежный тест., @GolezTrol

Я нашел https://github.com/kyab/travis-test-arduino, но его экспериментальный и исчерпывающий ответ/руководство было бы лучше., @Jakob

Проблема в том, что это противоречит первоначальной цели непрерывной интеграции: она предназначена для внесения изменений, а затем их автоматического создания и развертывания в течение нескольких минут. Это позволит вашим клиентам получать новейшие функции и исправления по мере их появления, а не каждые два месяца. Для Arduino это просто «облако, обеспечивающее сборку». Для модульных тестов вам, возможно, придется обойти библиотеки Arduino для создания функций и отправки примеров данных через «контакты»., @Anonymous Penguin

За этим вопросом стоит несколько вариантов использования + разные ответы для каждого. Если вариант использования _функциональные модульные тесты_, как уже предлагалось, вы измените возвращаемые функции вашего кода, но это не является надежным: и есть недостатки, если это встроено в ваш результат. Если ваш вариант использования заключается в том, что вы хотите _измерить_ интеграцию с аппаратным обеспечением, например: «Зажигает ли Arduino светодиод в ответ на стимулы, то есть температуру?» Будь креативным. Вам понадобится дополнительное аппаратное и программное обеспечение, которое сможет _наблюдать_ за тем, что делает тестируемый Arduino, а затем иметь возможность передавать сообщения программе запуска тестов (PySerial и т. д.)., @Scott Prive

@AnonymousPenguin "обходить библиотеки Arduino для создания функций и отправлять примеры данных через "контакты". - это то, что я сделал [в библиотеке, обсуждаемой в моем ответе здесь](https://arduinoprosto.ru/q/50534 /42393). Он позволяет тестировать такие вещи, как «зажигает ли Arduino светодиод в ответ на стимулы, например температуру», исключительно в программном обеспечении. Другими словами, он делает больше, чем просто «проверяет, что он строит»., @Ian


6 ответов


6

Новейшая версия Arduino ide имеет интерфейс командной строки для создания и загрузки кода. Но вы, очевидно, можете сделать это с помощью makefile и avrdude. Итак, вы скомпилировали свой код, НО вам нужно его протестировать. Поскольку симулятор сложен, неполный, обширный и... Просто симуляция, и поскольку чип относительно дешев, создание платы-ведьмы сделает взаимодействие аппаратного обеспечения И проверку результатов самым быстрым и простым способом. На эту «специальную» плату вы можете загрузить что-то вроде интерпретатора, который проведет тест с ПК и выполнит его, что-то похожее на Firmata для Arduino. По крайней мере, я бы построил именно так. И, насколько мне известно, эта реализация неизвестна, хотя я совершенно уверен, что многие отрасли должны и, вероятно, это сделают.

,

3

Один пример настройки непрерывной интеграции Jenkins для проекта Arduino можно найти здесь: Непрерывная интеграция встраиваемых систем

В примере показано, как собрать и загрузить образ в Arduino, а также выполнить веб-тесты Selenium (тестируемая система представляет собой веб-сервер на базе Arduino).

,

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


4

Как создатель PlatformIO я бы рекомендовал вам изучить его. Это кроссплатформенный конструктор кода и отсутствующий менеджер библиотек. Он может создавать один и тот же код для многих популярных платформ и плат разработки встраиваемых систем.

PlatformIO можно интегрировать со многими популярными системами непрерывной интеграции (CI) (или вашими собственный). См. документацию с примерами.

Давайте рассмотрим конфигурацию/шаблон .travis.yml для Travis CI:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=path/to/source/file.c
    - PLATFORMIO_CI_SRC=path/to/source/file.ino
    - PLATFORMIO_CI_SRC=path/to/source/directory

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

script:
    - platformio ci --board=TYPE_1 --board=TYPE_2 --board=TYPE_N

Пример

Интеграция для проекта USB_Host_Shield_2.0. Файл конфигурации .travis.yml:

language: python
python:
    - "2.7"

env:
    - PLATFORMIO_CI_SRC=examples/acm/acm_terminal
    - PLATFORMIO_CI_SRC=examples/Bluetooth/WiiIRCamera PLATFORMIO_BUILD_FLAGS="-DWIICAMERA"
    - PLATFORMIO_CI_SRC=examples/ftdi/USBFTDILoopback
    - PLATFORMIO_CI_SRC=examples/Xbox/XBOXUSB
    # - ...

install:
    - python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"

    # Libraries from PlatformIO Library Registry
    # http://platformio.org/#!/lib/show/416/TinyGPS
    # http://platformio.org/#!/lib/show/417/SPI4Teensy3
    - platformio lib install 416 417

script:
    - platformio ci --board=uno --board=teensy31 --board=due --lib="."
  • Файл конфигурации: https://github.com/felis/USB_Host_Shield_2.0/blob /master/.travis.yml
  • История сборки: https://travis-ci.org/felis/USB_Host_Shield_2.0
,

Если вы являетесь аффилированным лицом или связаны с PlatformIO, вам следует указать это в своем ответе, иначе он может быть помечен и удален как спам. Спасибо!, @Nick Gammon


1

Я бы посоветовал использовать плагин arduino eclipse под названием sloeber sloeber.io, руководителем проекта которого я являюсь.
Он интегрируется с контролем версий и позволяет создавать приложения на нескольких платформах, поскольку поддерживает несколько конфигураций.
Хотя это еще не доказательство идиотизма, я задокументировал и продемонстрировал модульное тестирование кода Arduino на локальном компьютере с использованием тестовой среды Google.
Вот ссылка на блог, содержащий презентацию того, как вы можете это сделать. http://blog.baeyens.it/#post25

,

3

Я написал этот тест unittest для Arduino, так как не смог найти правильное существование. Хотя я не писал его для CI, он хорошо подойдет для работы CI, поскольку не требует аппаратного обеспечения, но его можно запускать на ПК.

Выполнение заданий CI без аппаратного обеспечения имеет хорошие и плохие стороны, но в этом есть и хорошие стороны

  • Нет перепрошивки, не требуется никакого оборудования -> можно запускать параллельно -> быстро проверять, например, каждый коммит
  • Никаких аппаратных проблем, влияющих на тесты -> не нужно беспокоиться, этот тест просто не удался, потому что мой аппаратный компонент XYZ нестабилен.

Недостатки:

  • Это не проверка фактического целевого кода, например, ваш int имеет размер 32 бита на вашем ПК и 16 битов в AVR.
,

«_Ваш 'int' на вашем ПК имеет размер 64 бита_»: вы, вероятно, имеете в виду «32 бита» или используете какую-то экзотическую ОС., @Edgar Bonet

Вы правы, конечно, спасибо. Я отредактировал свой ответ, чтобы исправить это., @susundberg

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


3

Я только что собрал описание приличного размера в качестве ответа на этот связанный вопрос о написанная мной среда CI/модульного тестирования Arduino, которая наконец-то достаточно зрелая, чтобы начать говорить о ней публично.

Гем Ruby arduino_ci поддерживает как локальное тестирование, так и интеграцию Travis CI (например, эта сборка работа в библиотеке Adafruit FONA).

Некоторые примеры интеграции:

  • Показанная выше библиотека примеров DoSomething используется для тестирования самого arduino_ci.
  • Практический пример: тестирование реализации очереди
  • Сложный пример, моделирующий библиотеку, которая управляет интерактивным устройством через соединение SoftwareSerial как часть библиотеки Adafruit FONA.

У меня есть проблема, созданная для сообщения о размере скетча, но над ней не было проделано никакой работы. Также возможно, что когда-нибудь я смогу распараллелить сборки, но на данный момент я не совсем уверен, как бы я это сделал. На данный момент самым трудоемким этапом сборки Travis CI является загрузка Arduino IDE... параллельное тестирование не сильно повлияет на это, если этот шаг необходимо выполнять для каждого задания.

,