Автоматизация разработки и тестирования MicroPython с использованием непрерывной интеграции

Ari Mahpour
|  Создано: 3 Декабря, 2022  |  Обновлено: 27 Августа, 2023
Micropython

В статье Getting Started with MicroPython and the Raspberry Pi Pico (Начало работы с MicroPython и Raspberry Pi Pico) мы рассмотрели, как установить, настроить и запустить MicroPython на устройстве Raspberry Pi Pico. В этой статье мы сосредоточимся на автоматизации процесса и его превращении в конвейер по непрерывной интеграции (CI). Перемещение автоматизации в CI гарантирует постоянное тестирование кода при отправке фиксации в наш репозиторий кода.

Автоматизация команд и разработки MicroPython

После изучения того, как начать работу с MicroPython и устройством Raspberry Pi Pico, мы хотим найти способы автоматизировать процесс разработки кода. В статье Getting Started with MicroPython and the Raspberry Pi Pico (Начало работы с MicroPython и Raspberry Pi Pico) мы выполнили несколько различных команд для демонстрации разных наборов функций устройства Raspberry Pi Pico. Теперь мы рассмотрим, как автоматизировать один из этих примеров с помощью сценариев, а затем поместим его в CI. Сначала рассмотрим пример, который мы запускали из терминала.

Пример терминала

Эта команда предоставила нам информацию об экземпляре машины. В нашем случае:

Экземпляр машинного обучения

Это говорит нам о том, что мы используем MicroPython версии 1.19.1 на устройстве Raspberry Pi Pico с чипом RP2040. Вместо того чтобы запустить эту команду через оболочку интерпретатора с помощью PuTTY или Thonny IDE, мы можем фактически запустить весь процесс из командной строки с помощью инструмента, который поставляется в комплекте с библиотекой MicroPython. Инструмент Pyboard.py предоставляет нам механизм для выполнения команд непосредственно на целевом устройстве без необходимости открывать оболочку интерпретатора (или загружать новые файлы непосредственно на плату). Кроме того, он предоставляет нам другие команды файловой системы, такие как перечисление и копирование файлов на целевое устройство или с него. Например, можно выполнить команду sys.implementation (выше) с помощью инструмента Pyboard.py следующим образом:

python pyboard.py --device $TARGET_PORT --command "import sys; print(sys.implementation)"

где $TARGET_PORT — это COM-порт, под которым отображается ваше устройство. Это позволяет пропустить этап PuTTY/Thonny IDE и перейти к процессу автоматизации.

Интеграция кода в CI

Теперь, когда мы можем автоматизировать выполнение команд удаленно на нашем целевом устройстве, необходимо создать из этого полный сценарий на Python. Пользоваться библиотекой Pyboard оказалось довольно просто. В этом примере сценария Python мы выполняем ту же команду, что и выше, но с дополнительными манипуляциями (например, автоматическое обнаружение COM-порта и добавление некоторых проверок на основе утверждений). Принцип, однако, такой же: взять экземпляр машины и проверить то, с чем работаем.

После того как мы внесли все это в сценарий, его можно поместить в систему CI. Как обычно, для реализации я использую Gitlab, но с собственным средством выполнения задач, чтобы запрограммировать устройство Raspberry Pi Pico. Вы можете следить за всем проектом здесь, но файлом, представляющим интерес, является сценарий .gitlab-ci.yml. Он содержит «инструкции» для сборок, появляющиеся автоматически каждый раз после внесения мной изменений в код и его отправки обратно в Gitlab.

Здесь есть несколько «заданий», но только одно не связано с устройством Raspberry Pi Pico: этап сборки Docker. Создание контейнера Docker вносит нашу среду в нечто похожее на виртуальную машину. При запуске задания CI в контейнере Docker оно может быть запущено практически в любом месте (при соблюдении нескольких минимальных требований). В данном случае мне не нужны специальные библиотеки, установленные на моем настольном компьютере, подключенном к целевому устройству, поскольку контейнер Docker изначально содержит все вышеперечисленное. Единственное различие, которое следует упомянуть, заключается в том, что мой контейнер Docker должен быть запущен в «привилегированном» режиме (или как минимум иметь явное разрешение на доступ к целевому устройству), иначе он не сможет взаимодействовать с целевым устройством.

Как только мой контейнер Docker создан, появляется возможность извлекать образ из Gitlab при каждом запуске задания. Здесь начинается самое интересное. Вы сможете заметить, что мои задания становятся все более абстрактными и, следовательно, более сложными. Наконец, в последнем задании мы запускаем весь процесс через Pytest Framework.

Использование Pytest с MicroPython

Если вы знакомы с некоторыми из моих предыдущих статей, таких как FPGA: Creating Continuous Integration Pipelines for Embedded Systems (FPGA: создание конвейеров по непрерывной интеграции для встраиваемых систем) или PCB, Low-Cost Verification for Digital and Analog Filters (PCB: Малозатратная проверка цифровых и аналоговых фильтров) и Configuring a Hardware in the Loop Project (Настройка оборудования в проекте цикла), то заметите, что я довольно большой поклонник инфраструктуры Pytest. MicroPython ничем не отличается. Я по-прежнему использую Pytest, поскольку для моего уставшего ума это простой способ проверить некоторые из моих сценариев Python.

Последнее вызываемое задание CI запускает сценарий Pytest test_rpi_pico.py. Оно почти идентично сценарию rpi_pico_check.py, за исключением того, что оно создает отчет о тестировании. Как всегда, мы берем этот отчет о тестировании и отправляем его в Gitlab для анализа, чтобы получить небольшой тестовый раздел с результатами о прохождении.

Рисунок 1. Сводка тестов для Pytest

Этот простой тест подтверждает информацию, которую мы рассмотрели в предыдущей статье. Что действительно хорошо в проделанной работе, так это автоматизация. Каждый раз при изменении кода мы запускаем проверку, чтобы убедиться, что работа идет с нужным устройством. В данном случае мы используем MicroPython версии 1.19.1 на Raspberry Pi Pico с чипом RP2040.

Заключение

В этой статье мы вспомнили проводимые вручную этапы, необходимые для связи с устройством Raspberry Pi Pico. Затем этот ручной процесс превратили в сценарий. После автоматизации процесса с помощью сценария мы рассмотрели, как интегрировать рабочий процесс в систему CI и включить его в Pytest. После изучения примеров в этой статье вы сможете писать собственные сценарии и интегрировать их в CI.

Об авторе

Об авторе

Ари — инженер с большим опытом работы в сфере проектирования, производства, тестирования и интеграции электрических, механических и программных систем. Он стремится к созданию дружного сообщества специалистов по разработке, верификации и тестированию решений.

Связанные ресурсы

Связанная техническая документация

Вернуться на главную
Thank you, you are now subscribed to updates.