2009-06-30 2 views
55

Какие лучшие практики вы использовали в модульном тестировании встроенного программного обеспечения, характерного для встроенных систем?Единичное тестирование встроенного программного обеспечения

+3

@BillTheLizard Это очень хороший вопрос, с несколькими хорошими ответами ниже. Пожалуйста, проголосуйте, чтобы снова открыть его? –

+1

@IanGoldby Нет, это подпадает под [Какие типы вопросов я должен избегать?] (Http://stackoverflow.com/help/dont-ask) –

+3

@BilltheLizard Какой тест не удается?Я рассматриваю это как законный запрос на помощь в решении проблем с модульным тестированием, свойственных встроенным системам. На него можно ответить совершенно объективно. (Тот факт, что вопрос и некоторые ответы очень проголосовали, указывает на то, что другие, кроме меня, сочли это полезным.) Помогло бы мне, если бы я сформулировал вопрос? –

ответ

44

Встроенное программное обеспечение может быть долгий путь за последние 10 лет, но в целом мы сделали следующее:

  • для алгоритмов, которые не зависят от целевого оборудования, мы просто должны были модульные тесты, которые были построены и протестированы на не встроенной платформе.
  • Для оборудования, требующего оборудования, модульные тесты были условно скомпилированы в код для использования любого оборудования. В нашем случае это был последовательный порт на целевом экране, который подталкивал результаты к другой, более способной машине, где тесты проверялись на правильность.
  • В зависимости от аппаратного обеспечения иногда можно было бы заглушить виртуальное устройство на не встроенной платформе. Обычно это состояло в том, что другой поток выполнения (или сигнальная функция) менял память, используемую программой. Полезно для ввода/вывода с памятью, но не для IRQ и т. Д.
  • Обычно вы можете только тестировать небольшое подмножество полного кода за раз (из-за ограничений памяти).
  • для проверки чувствительных к времени вещей, мы этого не сделали. Легко и просто. Аппаратное обеспечение, которое мы использовали (8051 и 68302), не всегда было функциональным, если оно работало слишком медленно. Такая отладка должна была быть выполнена первоначально с помощью CRO (осциллографа) и (когда у нас было больше денег) ICE (внутрисхемный эмулятор).

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

+1

, который звучит очень похоже на текущее состояние дел, насколько я знаю. По крайней мере, на основе работы с TI TMS320 за последний год или около того. – JustJeff

+1

Вы имеете в виду, что перечисленные методы являются «современными», я надеюсь. Конечно, никто до сих пор не использует 8051 (68302 будет хорошо, так как у меня есть приятные воспоминания о Motorola 68k - это * все еще * более чистая архитектура, x86 IMNSHO)? Я надеялся, что все новые встроенные разработки были сделаны на Intel-клоны из-за множества вариантов разработки. – paxdiablo

+5

есть TONS для систем, которые строятся и разрабатываются сегодня с 80-дюймовым UC в них и даже больше с PIC, который является очень похожей архитектурой/уровнем производительности, как современные 8051. – Mark

0

Множество встроенных процессоров доступно на платформах eval, поэтому, хотя у вас могут не быть настоящих устройств ввода-вывода, часто вы можете выполнять множество своих алгоритмов и логики на одном из таких видов, часто w/аппаратная отладка доступна через jtag. И тесты «unit» обычно в большей степени касаются вашей логики, чем ваш i/o. Обычно проблема заключается в том, что ваши тестовые артефакты возвращаются из из одной из этих сред.

13

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

  • Охарактеризуйте аппаратные зависимости, когда это возможно. Таким образом, вы можете запускать свои модульные тесты на издеваемое «оборудование», а также тестировать различные редкие/исключительные случаи, которые было бы сложнее проверить на целевом уровне. Чтобы предотвратить затраты на абстракцию, вы можете использовать, например, условный сбор.

  • Как можно меньше зависит от оборудования.

  • Модульные тесты, запущенные на эмуляторе или в среде кросс-компилятора, по-прежнему не гарантируют, что код работает на целевом оборудовании. Вы должны также проверить цель. Испытание на цель как можно раньше.

+0

Очень хороший ответ. – Dan

+2

Я добавлю к «Тест на цель как можно раньше». - это удваивается, если это настраиваемое оборудование или аппаратное обеспечение со значительными пользовательскими компонентами. – Vicky

0

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

Если вы , напишите интерфейс связи, извините.

19

Там может быть много, которые можно получить с помощью модульного тестирования в среде ПК (компиляции кода с ПК C компилятором и работает ваш код в рамках модульного тестирования ПК), с несколькими оговорками:

  1. Это не относится к тестированию вашего низкоуровневого кода, включая код запуска, тесты RAM, аппаратные драйверы. Вам придется использовать более прямое модульное тестирование.
  2. Компилятор вашей встроенной системы должен быть заслуживающим доверия, поэтому вы не будете искать ошибки, созданные компилятором.
  3. Ваш код должен быть многоуровневой архитектуры с аппаратной абстракцией. Возможно, вам понадобится написать симуляторы драйверов устройств для вашей платформы тестирования модулей ПК.
  4. Вы должны всегда использовать stdint.h типы, такие как uint16_t, а не обычная unsigned int т.д.

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

Преимущество модульного тестирования на платформе PC:

  1. Вы не сталкиваетесь с проблемой запуска из ПЗУ пространства на встроенную платформу из-за добавление рамки модульного тестирования.
  2. Цикл цикла компиляции обычно быстрее и проще на платформе ПК (и позволяет избежать этапа «запись/загрузка», который может быть несколько минут).
  3. У вас есть больше возможностей для визуализации прогресса (некоторые встроенные приложения имеют ограниченные периферийные устройства ввода-вывода), хранение входных/выходных данных для анализа, выполнение более трудоемких тестов.
  4. Вы можете использовать легкодоступные платформы для тестирования на основе ПК, которые недоступны/пригодны для встроенной платформы.
6

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

A) Напишите как можно больше вашего аппаратно-независимого кода приложения, как вы можете, в среде ПК, прежде чем писать его на целевом компьютере, и напишите свои модульные тесты на то же самое время (делать это на ПК сначала должно помочь заставить вас отделить аппаратно-независимые вещи). Таким образом, вы можете использовать свой выбор тестеров модулей, а затем проверить аппаратно-зависимый материал старомодным способом - с RS-232 и/или осциллографами и выводами ввода-вывода, сигнализирующими зависящие от времени данные, в зависимости от того, насколько быстро он должен работать ,

B) Напишите все это на целевом оборудовании, но у вас есть цель make, чтобы условно скомпилировать модульную тестовую сборку, которая будет запускать модульные тесты и выводить результаты (или данные, которые могут быть проанализированы для результатов) через RS-232 или некоторые другие средства. Если у вас мало памяти, это может быть сложно.

Редактировать 7/3/2009 У меня просто была другая мысль о том, как тестировать аппаратное обеспечение.Если ваши аппаратные события происходят слишком быстро, чтобы записывать с помощью RS-232, но вы не хотите вручную просеивать тонны данных данных осциллографа, чтобы увидеть, как ваши флаги контактов ввода-вывода растут и падают, как ожидалось, вы можете использовать ПК карты со встроенным DIO (например, карты данных National Instruments) для автоматической оценки времени этих сигналов. Тогда вам просто нужно будет написать программное обеспечение на вашем ПК, чтобы управлять карточкой сбора данных для синхронизации с текущим тестированием устройства.

3

Там много хороших ответов здесь, некоторые вещи, которые не были упомянуты, чтобы иметь диагностический код работает для того, чтобы:

    Log HAL события (прерывания, автобусные сообщения и т.д.)
    У вас есть код для отслеживания ваших ресурсов (все активные семафоры, активность потоков)
    Имейте механизм захвата, чтобы скопировать содержимое кучи и памяти в постоянное хранилище (жесткий диск или эквивалент) для обнаружения и отладки тупиков, живого звука, утечек памяти , переполнение буфера и т. д.
11

Возможно, вы захотите проверить Test Driven Development for Embedded C от James W. Grenning. Книга планируется опубликовать в августе 2010 года, но бета-версия доступна сейчас по адресу The Pragmatic Bookshelf.

+0

Я только что купил эту книгу. Теперь я перехожу во встроенный мир, и я бы хотел использовать модульный тест с Microchip C30, и у меня возникли трудности. –

2

Когда я столкнулся с этим прошлым годом, я действительно хотел протестировать на встроенной платформе. Я разрабатывал библиотеку, и я использовал вызовы RTOS и другие функции встроенной платформы. Не было ничего конкретного, поэтому я адаптировал код UnitTest ++ для моих целей. Я программирую на семейство NetBurner, и поскольку он имеет встроенный веб-сервер, было довольно просто написать веб-интерфейс для тестирования GUI, который дает классическую обратную связь RED/GREEN. Это turned out pretty well, и теперь модульное тестирование намного проще, и я чувствую себя намного увереннее, зная, что код работает на реальном оборудовании. Я даже использую модуль тестирования модулей для проведения интеграционных тестов. Сначала я обманываю/заглушаю аппаратное обеспечение и внедряю этот интерфейс для тестирования. Но в конце концов я пишу некоторые тесты «человек-в-цикле», которые используют фактическое оборудование. Оказывается, это гораздо более простой способ узнать об оборудовании и иметь простой способ восстановления от встроенных ловушек. Поскольку все тесты выполняются с обратных вызовов AJAX на веб-сервер, ловушка происходит только в результате ручного вызова теста, и система всегда перезапускается через несколько секунд после ловушки.

NetBurner достаточно быстр, чтобы цикл записи/компиляции/загрузки/запуска составлял около 30 секунд.

6

Нам удается получить довольно много кода, зависящего от оборудования, с помощью симулятора, мы используем симулятор Keil и IDE (а не аффилированные только с их помощью). Мы пишем сценарии симулятора, чтобы управлять «оборудованием» так, как мы ожидаем, что он будет реагировать, и мы сможем довольно надежно проверить наш рабочий код. Конечно, это может приложить определенные усилия для моделирования аппаратного обеспечения для некоторых тестов, но для большинства вещей это очень хорошо работает и позволяет нам сделать многое без какого-либо оборудования. Нам удалось получить почти полную систему, работающую в симуляторе, прежде чем иметь доступ к аппаратным средствам, и у них было очень мало проблем, связанных с тем, как однажды поставить код на реальную вещь. Это также может значительно ускорить выпуск кода, поскольку все может быть сделано на ПК с более глубоким отладчиком, доступным во время моделирования чипа, и пытается сделать все на аппаратном уровне.

Получил это, чтобы надежно работать для сложных систем управления, интерфейсов памяти, пользовательских ИС, управляемых SPI, и даже моно-дисплея.

Смежные вопросы