Тестирование Встраиваемых Систем — Это Один Из Аспектов, О Котором Почему-То Мало Говорят.

Написать статью меня побудило прочтение статьи с похожим названием, недавнее посещение Embedded World и опыт разработки в этой области.

Почему-то, когда говорят о тестировании применительно к встраиваемым системам, почти всегда имеют в виду платформу, позволяющую «отрезать» эту самую встраиваемую систему, чтобы протестировать написанный код «независимо от аппаратной платформы».

Конечно, подход имеет свое место, и с его помощью можно многое проверить и найти, но.

Вот пример простой системы: микроконтроллер и инфракрасный датчик температуры, подключенный к нему по I2C. Как мы будем тестировать? Что здесь можно виртуализировать, чтобы тест не потерял всякий смысл? Что, если весь код по сути сводится к инициализации периферийных устройств контроллера I2C и реализации протокола связи с самим датчиком? А также блокировка доступа к ресурсу в случае многозадачной среды.

На мой взгляд, для нормального тестирования нужно иметь возможность считать значение температуры с датчика, и каким-то образом получить данные извне о реальной температуре окружающей среды и/или объекта, на который указывает датчик.

И сравните их.

Те.

для обычного «сквозного» тестирования, на мой взгляд, без реальной платы с контроллером и датчиком, а также «внешнего» интерфейса связи не обойтись.

В самом крайнем случае, мы Можно предположить, что температура в помещении, где работают люди, будет находиться в пределах 18-30 градусов, и проверить полученное значение, попадает ли оно в этот интервал.

Но если вам нужно проверить точность, то без тепловизионной камеры, увы, не обойтись.

Пример из жизни: нам как-то приходилось работать с микросхемой ADG2128 — коммутационной матрицей 8х12, управляемой по I2C. А у чипа, как оказалось, был недокументированный глюк — его I2C-часть «будила» чип не только тогда, когда он получал свой адрес в начале пакета, но и всякий раз, когда его адрес обнаруживался на шине.

Даже в середине выступления.

I2C предназначен для подключения нескольких устройств.

И вот - на этой же шине висит связь с другим устройством, и в середине общения проскакивает байт с адресом этого ADG, он просыпается и начинает выдавать свои данные на шину.

В общем, это был интересный баг, и его исправление тоже было костылем весьма своеобразным, хотя в конце концов оно работает. Итак, как же можно было «отловить» такой или подобный глюк с помощью подхода тестирования без наличия самой встроенной системы с «живым» чипом на ней? Еще пара примеров из жизни встраиваемых систем: после добавления очередной функции у контроллера заканчивается память.

Добавление новой функциональности приводит к гонкам или тупикам.

Альтернативно, к аналогичным последствиям приводят неверные, но все же возможные в реальности действия пользователя из серии «подключиться к устройству не так/не так/не в том месте/не в то время».

Или отправьте на устройство неправильную конфигурацию.

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

.

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

Когда мы разрабатывали DSLAM (телекоммуникационное устройство с широким Ethernet на одном конце и 32/64/128 DSL-модемами на другом), испытательный стенд выглядел примерно так: 64 модема, подключенные к 64 портам генератора трафика L2/L3. и Uplink подключен к другому порту.

Тестовый скрипт настроил DSLAM, генераторы трафика, запустил трафик и проверил результаты.

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

зажим или датчик давления), а также выводить значения, которые бы выдавал реальный датчик.

Сценарий тестирования – задайте на выходах комбинацию датчиков и сгенерированные значения, настройте тестируемое устройство (задайте датчик, диапазон и т. д.), измерьте их с тестируемым устройством и сравните со сгенерированными.

Все это было интегрировано в CI-систему — текущий билд был собран и загружен в устройство, после чего началось описанное выше тестирование.

Системы использовались как на этапе разработки для регрессионного тестирования, так и на этапе производства для тестирования нового устройства перед отправкой его в эксплуатацию.

Несомненно, такой подход дорогой — но при длительном и сложном многофункциональном проекте альтернативы ему, мне кажется, нет. А без него — прямая дорога к «смертельному циклу тестирования» (Увеличение необходимого количества «ручных» тестов по мере добавления новых функций, как следствие — даже самое простое изменение в коде невозможно внести быстро: 1 час на изменение/исправление ошибок и неделя ручного регрессионного тестирования, ага.

Про неделю – это не шутка, увы.

) Сейчас делаем саму систему тестирования в виде более-менее универсальной модульной системы, посмотрим, понадобится ли она еще кому-нибудь.

Теги: #встроенные системы #тестирование #программирование #программирование микроконтроллеров #тестирование ИТ-систем

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.