Нередко случается, что встраиваемые системы поступают на рынок без достаточного тестирования. И это неудивительно, ведь весьма большой процент разработчиков таких систем не относится всерьез к внедрению и использованию каких-либо инструментов для проведения тестирования. А ведь подобное пренебрежение самым серьезным образом сказывается на качестве выпускаемой продукции, и, разумеется, не в лучшую сторону.
Для большинства встраиваемых приложений общепринятые методики тестирования программных приложений не подходят.
Тем не менее все больше специалистов обращается к методологии модульного тестирования (unit testing), находя ее весьма эффективной для тестирования встраиваемых приложений.
Модульные тесты — это тесты, которые направлены на конкретные C-функции и вызывают их с различными комбинациями значений входных параметров, что приводит к различным путям выполнения кода этих функций.

Сложности применения к встраиваемым приложениям

Разумеется, написание модульных тестов вручную — очень трудоемкий, дорогостоящий и однообразный процесс. К тому же велика вероятность, что многие из возможных путей выполнения программы останутся непроверенными.
Для того чтобы написанные тесты приводили как можно к большему числу важных путей выполнения кода функции, требуется проведение тщательного анализа того, какие входные данные понадобятся для направления кода по разным путям выполнения. Это чрезвычайно трудоемкая и сложная, а порой и невыполнимая работа. А гарантированный результат может быть обеспечен разве что для самых тривиальных функций.
Здесь напрашивается вывод, что просто необходимы специализированные инструменты, которые выполняют всю эту работу автоматически.
Еще одна проблема, с которой сталкиваются команды разработчиков, — поддержание синхронизации модульных тестов с исходным тестируемым кодом, находящимся в разработке и постоянно изменяющимся.
Часто проблема усугубляется и очень плотным графиком работы команды, и нередко по мере развития проекта сроки все больше сжимаются. Так что если утрачивается синхронизация исходного кода и его модульных тестов, то последние теряют свою пользу, особенно в моменты, когда они наиболее необходимы.
И конечно, следует отдельно отметить, что сама специфика встраиваемых систем усложняет их тестирование.
Ведь изначально все тестирование проводится в удаленном режиме. А значит, наиболее эффективными модульными тестами будут те, что встроены в само приложение и запущены на целевом оборудовании в такой среде приложения, в которой действительно их предстоит использовать. И эффект здесь окажется значительно выше, чем при прогоне тестов на вспомогательных платформах, способных только работать в режиме симуляции.

Выбор стратегии тестирования

Модульное тестирование

Существует широкий ряд разнообразных инструментов, успешно применяемых для модульного тестирования приложений для ПК. Однако от них мало пользы разработчикам встраиваемых приложений. Ведь с помощью таких инструментов редко удается выполнить компиляцию, загрузку и проигрывание наборов тестовых сценариев на встраиваемом оборудовании.
Однако есть и специализированные инструменты, которые способны создавать модульные тесты автоматически, внедряют их во встраиваемые приложения и позволяют запускать их на целевом оборудовании в режиме JTAG-отладки. Применение таких инструментов приведет к оптимальному расходованию рабочего времени и максимальной производительности.
Но еще более эффективно использование полностью встраиваемой системы автоматизации тестирования, интегрированной в среду разработки (IDE). Это позволяет легко поддерживать синхронизацию исходного кода и модульных тестов.
Ранее в индустрии встраиваемых систем подобные инструменты широкого распространения не имели. Но в последнее время появляются все новые специализированные средства модульного тестирования, среди которых можно назвать Atollic TrueVERIFIER.

Возможности модульного тестирования Atollic TrueVERIFIER

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

Среди ключевых возможностей Atollic TrueVERIFIER:

  • автоматическое генерирование модульных тестов;
  • ручное редактирование созданных тестовых наборов;
  • проведение функционального тестирования;
  • проведение тестирования совместимости (интеграционное тестирование);
  • автоматическое исполнение тестовых наборов на целевом отладочном оборудовании;
  • оценка качества проведенного тестирования.

Автоматическое генерирование модульных тестов

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

Функциональное тестирование

Atollic TrueVERIFIER выполняет синтаксический анализ (парсинг) исходного кода приложения и внедряет в него автоматически генерируемый набор тестов. Эти тесты выполняют многократный вызов исследуемых функций с разными комбинациями входных параметров, что обеспечивает прохождение кода наибольшим числом различных путей исполнения.
Для сохранения полной свободы действий и для обработки дополнительных важных случаев наряду с работой в автоматическом режиме Atollic TrueVERIFIER позволяет редактировать или создавать тесты вручную, путем добавления пользовательских наборов значений к сгенерированным наборам входных параметров.
В дополнение к автоматическому обнаружению, какие из значений входных параметров влияют на ход исполнения функций,
Atollic TrueVERIFIER способен обнаруживать и тестировать и другие входные зависимости, такие как влияние на работу функций используемых глобальных переменных.

Интеграционное тестирование

Помимо исследования поведения каждой отдельно взятой функции (то есть функционального тестирования, о котором речь шла в предыдущем разделе), часто особый интерес представляет тестирование совместной работы функций, или интеграционное тестирование. Это исследование поведения исполняемого кода с более общей точки зрения. Базируется оно на составлении набора тестовых сценариев, в рамках которых тестируется совместная работа функций в штатном режиме и по назначению решаемых задач. Atollic TrueVERIFIER поддерживает и этот вид тестирования.

Редактирование сгенерированных тестовых наборов

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

Специалисты, выполняющие модульное тестирование, получают целый ряд возможностей дорабатывать тесты вручную. С помощью редактора тестовой конфигурации Atollic TrueVERIFIER позволяет:

  • редактировать наборы тестовых случаев или их входных параметров;
  • добавлять проверки возвращаемого кода;
  • добавлять код инициализации или завершения работы;
  • применять пользовательские способы обнаружения неисправностей произвольной сложности.