№37 (Надежность программного обеспечения) (1006294), страница 2
Текст из файла (страница 2)
Действительно, надежность программного обеспечения отличается от надежности аппаратуры па этапе пробной эксплуатации, во время пробной эксплуатации разработчик аппаратуры обычно знает свойства заменяемой детали или элемента. Программист же обычно не знает многого о свойствах переделанной части программы и о том, как она будет взаимодействовать с остальной частью программы. Вполне возможно, что вводится новый источник ошибок при попытке улучшить программу.
Рассмотрим параметр
как случайную величину. Пусть
функция плотности распределении
где
параметр. Теперь легко сформулировать условие для описания стремления программиста реализовать цель исправления программы. Вместо предположения, что интенсивность отказов стала после исправления определенно меньше, предполагается, что такое событие вероятно, имело место, т, е. что
Обозначим функцию распределения параметра
через
Тогда на основании (6.1)
Если
интенсивность отказов, то
для
В модели предполагается также, что восстановление мгновенное (т. е, время восстановления намного меньше, чем время безотказной работы),
Допустим, что имеются исходные данные
описывающие п первых отказов программы, и что программист исправляет i-ю ошибку, используя тот же метод, что и раньше. Необходимо оценить распределение времени до (n+1)-го отказа, используя предварительный
опыт.
Ф
ункции плотности распределения, удовлетворяющие приведенным выше требованиям и сочетающие близкие к реальным выражения с удобным математическим аппаратом, имеют вид
где
некоторая монотонно возрастающая от i функция.
Оценим время до следующего отказа, начиная с произвольного момента времени. Рис. 6.3 аналогичен рис. 6.2, однако время
означает время от восстановления после (п—1)-го отказа до настоящего момента времени (сейчас) — нового начала отчета времени t до следующего отказа. Результаты наблюдений
обозначают интервалы времени между отказами (или, точнее, между восстановлением после предыдущего и наступлением последующего отказа). Тогда после ряда преобразований на основании (6 2) и (6.3) может быть получено выражение для интенсивности отказов в момент времени tn (cейчас);
Предлагается выбрать функцию
в виде
Функция плотности распределения
времени до следующего отказа (рис. 6.3) выражается как
Рассмотрим сначала изменение
в течение одного периода безотказной работы между двумя отказами: имеется в виду, что n, а также
фиксированы, a tn растет. Следовательно, функция
убывает монотонно, поскольку второй член в (6,4) убывает монотонно. Это согласуется с интуитивными соображениями: мы склонны считать систему тем более падежной, чем больше времени она отработала после последнего отказа. В момент отказа величина
не определена, но можно определить ее значен
ия непосредственно перед отказом и непосредственно после последнего исправления программы, когда имеется ряд
Второй член (6.4) при
этом остается неизменным, а первый член превращается из
. Это означает, что после исправления программы мгновенная интенсивность отказов уменьшается скачком, если
или
Последнее неравенство удовлетворяется в случае, если
растет от i быстрее, чем по линейной зависимости. Мгновенная интенсивность отказов (6.4), таким образам, имеет тенденцию убывать как при исправлениях при условии достаточно быстрого роста функции
так и во время исправной работы между отказами.
На рис. 6.4 приведена зависимость
для некоторого участка эксплуатации программы; 1 — момент первого и 2 — момент второго отказа.
Приведенная (6.4) модель, предложенная Б. Литтл-вудом и Дж. Л. Верраллом [32], может быть упрощена, если полагать, что
что имеет место при достаточно больших i. Тогда
т
, е, мгновенная интенсивность отказов обратно пропорциональна некоторой взвешенной средней от интервалов времени между отказами. Коэффициенты
и
(6.5), входящие в, могут быть определены по экспериментальным данным, например методом максимума
правдоподобия.
Рассмотренная модель хорошо объясняет процессы, происходящие в ходе формирования последовательности отказов — восстановлении. Однако для практических расчетов и прогнозов надежности программ предложены более простые модели надежности.
Модель Джелннскога—Моранды [21]. Эта модель основана на следующих допущениях: 1) время до следующегo отказа распределено экспоненциально; 2) интенсивность отказов программы пропорциональна количеству оставшихся и программе ошибок.
Согласно этим допущениям вероятность безотказной работы программ как функции времени
, равна
Здесь
коэффициент пропорциональности; N — первоначальное число ошибок программы. В (6.7) отчет времени начинается от момента последнего (i-1)-го отказа программы.
Модель Шумана. Данная модель отличается от модели Джелинского—Моранды только тем, что периоды времени отладки и эксплуатации рассматриваются отдельно.
Модель Шика—Волвертона. Основой этой модели является предложение о том, что интенсивность проявлении ошибок программы пропорциональна не только количеству оставшихся в программе ошибок, но и времени, потраченному на отладку.
Недостаток рассмотренных моделей в том, что при неточном определении N интенсивность отказов программы делается отрицательной, а это приводит к бессмысленному результату. Кроме того, здесь предполагается, что после обнаружения ошибка ликвидируется полностью и не вносятся новые ошибки, что тоже не очевидно.
СТРУКТУРНЫЕ МЕТОДЫ ТЕСТИРОВАНИЯ ПРОГРАММ
Тестирование—проверка работы программы по результатам ее выполнения на специально подобранных наборах исходных данных – тестах.
Программа может быть тестирована либо полностью (полное тестирование), либо выборочно (выборочное тестирование) в отдельных точках пространства исходных данных.
При выборочном тестировании надежность программы не может быть полностью гарантирована. Если тесты предлагаются программистом, то они могут охватить только те части программы, с которыми программист наиболее знаком. Поэтому многие скрытые ошибки могут оставаться не обнаруженными.
Полное тестирование на всех возможных входных наборах программы или даже тестирование всех путей в структуре программы нереально, так как число тестов будет недопустимо большим. Например, если число входов равно десяти и каждый вход программы может приобретать десять значений, число необходимых элементарных тестов для проведения полного тестирования будет равно 1010. Поэтому предложено структурное выборочное тестирование, основанное на разделении пространства исходных данных на классы, причем каждый класс позволяет подтвердить определенные свойства или работоспособность определенных элементов структуры программы. Основной задачей при этом является построение генератора тестовых наборов для их автоматического генерирования.
Общая схема генератора тестовых наборов представлена на. рис. 6.7. Исходя из тестируемой программы Т выбирается набор путей П в структуре программы, удовлетворяющей некоторым критериям К тестирования. Наиболее часто эти критерии основаны на структуре программы. Достаточно простое требование может заключаться в том, что выбранные пути должны перекрывать
(задействовать) все операторы (команды программы).
Затем генерируются ограничения О, позволяющие реализовать тот или иной путь на графе программы. Ограничения преобразуются модулем ПВ в ограничения к исходным данным. Только тогда с помощью алгоритма А генерируются тестовые наборы ТН — наборы числовых значений исходных данных, удовлетворяющих отдельным ограничениям.
Критерий выбора путей на структуре программы в простейшем случае состоит в том, что выбранные пути должны перекрывать (задействовать) все операторы (команды) хотя бы один раз. Поскольку при этом тестируются команды чаще всего в порядке их расположении в тексте программы; такое тестирование называется статическим тестированием. Однако при этом тестируются не все возможные пути на графе программы и ошибки в управлении программой могут оставаться необнаруженными.
Тестирование ветвей. Более строгое требование заключается в том, что выбранные пути должны перекрывать все ветви структуры программы или все разветвления по всем направлениям (динамическое тестирование или тестирование ветвей). Такой подход гарантирует однократное тестирование всех операторов и всех ветвей.
Опыт показывает, что значительное число ошибок возникает из-за неточностей при формулировке условий выхода из циклов, поэтому предлагается вводить еще дополнительное требование, чтобы каждый цикл испытывался двумя тестами, один из которых привел бы к исполнению цикла с возвратом, а друг ой бы проходил цикл без возврата.
Верификация программ. Всякое тестирование с помощью числовых наборов исходных данных позволяет проверить программу только в ограниченном числе точек пространства исходных данных, поэтому наибольший интерес представляют более общие методы. Сюда относится прежде всего верификация программ — доказательство их правильности при помощи математических методов доказательства теорем. Для этого программа представляется в виде последовательности ряда более или менее простых утверждений, доказательство которых не представляет труда.
Символическое тестирование. В отличие от верификации тестирование программ заключается в проверке правильности числовых результатов работы программ при специально подобранных значениях входных переменных — тестовых наборов. В некоторых случаях тестирование может производиться и символически — выполнением процедур, основанных па символических входах (обозначениях вводных переменных, позволяющих выразить выходы программы также в символическом виде). Для различных путей программы при этом соответствуют различные символические входы и выходы. Если существует ограниченное число таких путей, то символическое исполнение может быть применено для подтверждения правильности программы с использованием символических выражений входов и выходов. Преимущество символического тестирования перед числовым тестированием заключается в том, что если числовой тест позволяет проверить работу программы на отдельных числовых значениях входных наборов, то символическое тестирование оперирует множествами исходных данных, определяемых ограничениями.















