Химические и амперные материалы; Materials Engineering
Использование Tdd для улучшения критически важного для безопасности программного обеспечения в механической и аэрокосмической технике
Table of Contents
Разработка, основанная на тестах (TDD), долгое время была основной практикой в гибкой разработке программного обеспечения, но ее роль в критически важных для безопасности областях, таких как механическая и аэрокосмическая инженерия, часто обсуждается. Критики утверждают, что накладные расходы на написание тестов до того, как код замедляет разработку, в то время как сторонники указывают на способность метода рано улавливать дефекты и обеспечивать строгий дизайн. В областях, где один программный сбой может привести к катастрофической потере жизни, имущества или миссии, ставки высоки. В этой статье исследуется, как TDD может быть адаптирован и использован для повышения надежности, ремонтопригодности и сертификации программного обеспечения, используемого в управлении полетом самолета, навигации космических аппаратов, системах управления двигателем и автоматизированных механизмах безопасности.
Цикл TDD: красно-зеленый-рефактор
По своей сути, TDD следует дисциплинированному трехфазному циклу:
- Красный: Напишите неисправный тест, который определяет желаемое поведение или критерий принятия.Тест должен быть конкретным, автоматизированным и как можно меньшим.
- Зеленый: Напишите минимальный объем производственного кода, необходимого для прохождения этого теста. Никакого рефакторинга, никакой спекулятивной общности — достаточно, чтобы удовлетворить тест.
- Рефактор: Очистите как производственный код, так и тестовый код. Улучшите читаемость, удалите дублирование и убедитесь, что дизайн остается простым и правильным, пока тесты продолжают проходить.
Этот цикл повторяется десятки или сотни раз на каждую функцию. Результатом является набор регрессионных тестов, который растет с кодовой базой и дизайном, который возникает из тестов, а не предварительно спланирован. В критически важных для безопасности контекстах TDD часто сочетается со статическим анализом, формальными методами и тестированием аппаратного обеспечения в цикле, а не используется изолированно.
Почему критически важное программное обеспечение требует особой строгости
В аэрокосмической промышленности такие стандарты, как DO-178C (для бортовых систем) и ARP4754A (для разработки гражданских воздушных судов и систем), требуют строгой проверки и проверки. Аналогичным образом, автомобильный сектор использует ISO 26262, в то время как промышленные и медицинские устройства следуют IEC 61508 или IEC 62304. Эти стандарты требуют, чтобы каждое требование было прослежено до тестовых случаев, чтобы покрытие кода измерялось и анализировалось, и чтобы процесс разработки давал доказательства правильности.
Традиционные подходы «код-тогда-тест» часто приводят к тому, что тестирование становится узким местом в конце проекта. Баги, обнаруженные во время интеграции или системного тестирования, дорого исправить, иногда требуя изменения требований или архитектуры. TDD переворачивает эту динамику, делая тестирование непрерывным первоклассным занятием. Как сказал соавтор оригинальной методологии TDD Кент Бек, тесты - это не просто система безопасности, а спецификация, которая управляет дизайном.
TDD в области машиностроения и аэрокосмической техники: вызовы и адаптации
Конкретные вызовы домена
Применение TDD в машиностроении и аэрокосмической технике не является простым переводом с веб- или корпоративного программного обеспечения.
- Зависимости от аппаратного обеспечения: Многие аэрокосмические системы включают встроенные контроллеры, которые взаимодействуют с датчиками, исполнительными механизмами и другими физическими компонентами. Написание чистых единичных тестов для такого кода часто требует аппаратных абстракций или симуляционных слоев.
- Реальное время и детерминированные ограничения: Тесты, которые выполняются на рабочей станции разработчика, могут не отражать чувствительное к времени поведение целевого оборудования. TDD сам по себе не может проверить, что цикл управления соответствует его срокам.
- Дизайн на основе моделей: Во многих аэрокосмических проектах инженеры используют такие инструменты, как MATLAB/Simulink или SCADE для моделирования поведения системы и автоматического генерирования кода. TDD может применяться к тестам на уровне модели (с использованием Model-in-the-Loop или Software-in-the-Loop) и к рукописному коду клея.
- Сертификационная документация: Такие стандарты, как DO-178C, требуют доказательств того, что тесты охватывают каждую строку кода и каждую ветвь.
Адаптация цикла TDD для встроенных систем, отвечающих за безопасность
Для решения этих проблем инженерные команды часто используют гибридный подход:
- Единичное тестирование с уровнями абстракции аппаратного обеспечения (HAL): При написании абстрактных интерфейсов для аппаратных периферийных устройств (например, ADC, PWM, CAN шина) разработчики могут единично тестировать логику управления без физического оборудования.
- Тестовые дублеры для физических моделей: Вместо использования реального двигателя или планера TDD-тесты могут использовать модели установок (симулированные системы), которые эмулируют физическое поведение. Это позволяет раннюю валидацию алгоритмов управления и логики обнаружения неисправностей.
- Статический анализ, интегрированный в «красную» фазу: «красная» фаза TDD может включать в себя не только динамические тесты, но и статические проверки соответствия MISRA, использования стека и правильности потока данных.
- Сопоставление TDD с формальными методами: Для наиболее важных функций (например, аварийное отключение, защита конверта полета) команды могут использовать формальные инструменты проверки для доказательства правильности, дополняя процесс, управляемый тестом.
Сертификация и стандарты: как TDD поддерживает соответствие
Одним из самых больших препятствий для принятия TDD в критически важной для безопасности технике является восприятие того, что он противоречит сертификационным требованиям. Фактически, TDD может быть мощным союзником в достижении соответствия при правильной практике.
Отслеживание требований к тестам
В соответствии с DO-178C каждое требование высокого уровня должно быть прослежено до требований низкого уровня, которые, в свою очередь, должны быть прослежены до тестовых случаев. В рабочем процессе TDD каждый тест записывается на основе конкретного требования или критерия принятия. Называя тесты после этих требований и поддерживая двунаправленную матрицу трассировки (например, используя инструмент управления требованиями, такой как ] DOORS или Jama ), набор тестов становится прямым доказательством охвата проверки.
Анализ структурного покрытия
Стандарты, такие как DO-178C Level A, требуют Модифицированное условие/охват решения (MC/DC) — это означает, что каждое условие в решении должно независимо влиять на результат. Традиция TDD писать много небольших целевых тестов облегчает достижение и документирование охвата MC/DC, чем традиционный подход к написанию нескольких больших интеграционных тестов.
Проверка требований vs. Проверка намерения
Один из рисков в TDD заключается в том, что разработчики могут тестировать свою собственную реализацию, а не проверять ее на соответствие первоначальным требованиям. Это известно как ошибка «проверки намерения». В критически важных проектах по-прежнему необходимы строгие проверки требований и независимая проверка (отдельной командой). TDD следует рассматривать как практику для команды разработчиков, а не замену формальным мероприятиям V & V.
Примеры из реального мира и тематические исследования
Программное обеспечение для управления полетом от крупного производителя аэрокосмической техники
Несколько аэрокосмических компаний, включая Airbus и Boeing, включили принципы TDD в свои встроенные процессы разработки программного обеспечения. Например, система управления полетом Boeing 787Boeing, разработанная с комбинацией модели на основе дизайна и ручной кодировки C, использовала методы тестирования агрегатов, которые очень похожи на TDD. Инженеры писали тестовые примеры против моделируемой модели завода до реализации логики управления, а затем уточняли реализацию до тех пор, пока все тесты не прошли. Результатом было сокращение дефектов интеграции на поздних стадиях и более плавный процесс сертификации.
Исследование, опубликованное в работе Международного симпозиума по разработке программной надежности IEEE 2017 года, показало, что команды, использующие TDD в контексте авионики, достигли на 40-60% меньше дефектов после выпуска по сравнению с теми, кто использует традиционный подход к водопаду. Ключом было то, что TDD заставил разработчиков задуматься о крайних случаях на ранней стадии — крайних случаях, которые в противном случае были бы пропущены до системной интеграции.
Единицы управления двигателем (ECU) в автомобильной промышленности
В то время как эта статья посвящена механической и аэрокосмической технике, автомобильный сектор предлагает ценные параллели. Bosch и Continental оба приняли TDD для управления двигателем и тормозных систем. В одном документально подтвержденном случае команда, разрабатывающая блок управления дизельным двигателем, использовала TDD для реализации более 3000 единичных испытаний, охватывающих логику времени впрыска топлива. Автоматизированный тестовый набор поймал тонкий переполнение целого числа в расчете с фиксированной точкой, который мог вызвать непреднамеренный скачок крутящего момента — дефект, который было бы чрезвычайно трудно обнаружить с помощью ручного тестирования интеграции.
Космический аппарат Attitude Control в NASA
Лаборатория реактивного движения НАСА (JPL) экспериментировала с TDD для частей программного обеспечения Mars Rover и Europa Clipper. Глубоководная среда накладывает уникальные ограничения: закаленные радиацией процессоры, ограниченная память и отсутствие возможности программного исправления после запуска (для миссий ровера исправление в конечном итоге было возможно, но рискованно). Инженеры JPL обнаружили, что TDD помог им создать более надежный код управления отношением, особенно в сочетании с тестированием на основе свойств и генерацией кода из моделей Simulink. Однако они также отметили, что TDD был непрактичен для самого автогенерированного кода — он лучше применялся к рукописной логике клея и оберткам операционной системы реального времени (RTOS).
Преимущества TDD для программного обеспечения, имеющего критический характер
Раннее обнаружение дефектов
Наиболее очевидным преимуществом является улавливание ошибок через несколько минут после их внедрения, а не через несколько недель во время системной интеграции. В критически важном для безопасности проекте дефект, который сохраняется до летных испытаний, может потребовать дорогостоящего перепроектирования или пересмотра графика. TDD резко сокращает среднее время обнаружения.
Живая документация
Хорошо написанный набор тестов служит исполняемой документацией. Когда новый инженер присоединяется к команде, он может прочитать тесты, чтобы понять, что должен делать каждый компонент. В сертификационном аудите набор тестов предоставляет объективные доказательства того, что код был проверен. Не требуется отдельный план испытаний или документ спецификации испытаний - хотя все еще разумно сохранять матрицу прослеживаемости требований.
Качество дизайна и разделение
TDD поощряет модульную конструкцию, потому что тесно связанный код трудно тестировать. В критически важных системах отсоединение не просто приятно — оно помогает изолировать неисправности и упрощает анализ отказов. Например, хорошо протестированный модуль отсоединения для обнаружения неисправностей может быть повторно использован на нескольких платформах самолетов без модификации, уменьшая нагрузку на проверку.
Предотвращение регрессии
Программное обеспечение, отвечающее за безопасность, развивается медленно, но оно развивается — исправление ошибки в одной части системы может привести к появлению новой в другом месте, если тесты не будут тщательными. С TDD каждое изменение немедленно проверяется на весь набор тестов, предотвращая регрессии от достижения производства. Это особенно ценно, когда несколько команд работают над общими кодовыми базами.
Ограничения и дополнительная практика
В области техники, имеющей важное значение для обеспечения безопасности, она должна дополняться рядом других методов, позволяющих достичь требуемого уровня доверия:
- Тестирование аппаратного обеспечения в контуре (HIL): Единичные тесты не могут заменить тестирование на фактическом оборудовании реалистичными входами и временем. Тестирование HIL должно проводиться в качестве отдельного этапа после TDD.
- Статический анализ: Такие инструменты, как Полиспространство, Участок или КодеСонар, могут доказать отсутствие ошибок времени выполнения (например, деление на ноль, переполнение буфера), которые TDD может пропустить, если тестовый набор неполный.
- Формальная проверка: Для наиболее важных компонентов (например, кода, который отключает двигатель во время состояния сверхскоростной скорости), формальные методы обеспечивают математическое доказательство правильности, которое выходит за рамки тестирования.
- Перовые обзоры и проверки: TDD не устраняет необходимости в ручных обзорах кода. Фактически, обзоры самого тестового кода ценны — они ловят неоднозначные или отсутствующие тестовые случаи.
- Анализ требований: TDD предполагает, что требования четко определены. На практике критически важные для безопасности проекты требуют тщательного предварительного анализа опасностей, режимов отказа и операционных сценариев. TDD должен следовать, а не предшествовать этому анализу.
Заключение
Test-Driven Development предлагает мощный набор практик для улучшения качества программного обеспечения в машиностроении и аэрокосмической технике - дисциплины, где отказ не является вариантом. Встраивая тестирование в самые ранние стадии разработки, TDD способствует культуре правильности и точности. Он также создает богатый, прослеживаемый массив доказательств, который поддерживает сертификацию по стандартам, таким как DO-178C и ISO 26262.
Однако TDD должен быть адаптирован к реалиям встроенных, в режиме реального времени и аппаратно-зависимых систем. Инженеры должны использовать аппаратные слои абстракции, модели установок и статический анализ, чтобы преодолеть разрыв между единичным тестированием и физическим миром. И TDD никогда не должен использоваться в качестве замены формальной проверки или независимого V&V. В сочетании с этими взаимодополняющими практиками TDD становится жизненно важным инструментом для создания более безопасных самолетов, космических аппаратов и механических систем.
Для команд, рассматривающих возможность внедрения TDD в критически важном для безопасности контексте, ключ заключается в том, чтобы начать с малого: выбрать подсистему с низкой критичностью, написать единичные тесты против моделируемой среды и интегрировать практику в существующий рабочий процесс. Преимущества - уменьшение дефектов, лучший дизайн и более быстрая сертификация - быстро станут очевидными.