Проектирование надежного программного обеспечения и его реализация

В проекте функционально надежного ПО рекомендуется применять широкий спектр хорошо апробированных правил и рекомендаций (рис. 5.8):

  • • модульный подход,
  • • программы, созданные на основе существующих стандартов проектирования и кодирования;
  • • жестко типизированные языки программирования, технологию структурного, а также объектно-ориентированного программирования;
  • • при создании программ с очень высокими требованиями функциональной надежности — такие языки программирования, как Ladder Diagrams, Functional Blocks, Statement List, ADA, MODULA-2, и ограничено — распространенные языки программирования типа C+ + ;
  • • только аттестованный транслятор или транслятор, проверенный в использовании;
  • • базирование на библиотеке проверенных модулей и апробированных компонентов;
  • • широкое использование функционального тестирования, тестирования методом «черного ящика» и тестирования производительности системы с данным программным обеспечением;
  • • регистрация и анализ данных и др.
Методы и способы создания проекта надежного ПО

Рис. 5.8. Методы и способы создания проекта надежного ПО

Программирование с выявлением ошибок проекта. Цель — обнаружить остаточные ошибки проекта ПО во время выполнения программы, чтобы предотвратить критически опасные отказы

ш системы и продолжать работу для обеспечения высокой надежности. Суть метода состоит в следующем. Производится проверка предварительного условия (прежде чем последовательность состояний будет выполнена, начальные условия проверяются на предмет их достоверности) и постусловия (результаты проверяются после выполнения последовательности состояний). Если либо предварительное условие, либо постусловие не выполняются, обработка останавливается с ошибкой.

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

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

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

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

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

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

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >