- •Надежность программного обеспечения
- •Общие сведения Сведения об эумк
- •Методические рекомендации по изучению дисциплины
- •Изучение теоретической темы.
- •Рабочая учебная программа
- •Учреждение образования
- •«Белорусский государственный университет
- •Информатики и радиоэлектроники»
- •1. Содержание дисциплины
- •1. Индивидуальные практические работы, их характеристика
- •2. Контрольные работы, их характеристика
- •3. Курсовая работа, ее характеристика
- •4. Литература
- •4.1.Основная
- •4.2. Дополнительная
- •5. Перечень компьютерных программ, наглядных и других пособий, методических указаний и материалов и технических средств обучения
- •Теоретический раздел Введение
- •1. Основные понятия и определения в области надёжности аппаратного обеспечения компьютерных систем
- •2. Показатели надежности компьютерных систем
- •2.1. Общие сведения
- •2.2. Показатели надежности невосстанавливаемых объектов
- •2.2.1. Вероятность безотказной работы
- •2.2.2. Вероятность отказа
- •2.2.3. Плотность распределения наработки до отказа
- •2.2.4. Интенсивность отказов
- •2.2.5. Средняя наработка до отказа
- •2.3. Показатели надежности восстанавливаемых объектов
- •2.3.1. Коэффициент готовности
- •2.3.2. Стационарный коэффициент готовности
- •2.4. Основные модели, используемые в теории надежности
- •3. Основные понятия и определения в области надежности программного обеспечения компьютерных систем
- •3.1. Проблема надежности программного обеспечения и её актуальность
- •3.2. Понятие свойств, функций и требований к программному обеспечению. Критерии качества требований
- •Корректность (правильность) требований
- •Недвусмысленность требований
- •Полнота набора требований
- •Непротиворечивость требований
- •Упорядоченность по важности и/или стабильности
- •Проверяемость требований (верифицируемость)
- •Целостность
- •Модифицируемость
- •Трассируемость
- •3.3. Понятие ошибки и отказа программного обеспечения
- •3.4. Понятие надежности программного обеспечения
- •3.5. Особенности программ по сравнению с аппаратурой
- •4. Анализ причин появления ошибок в программном обеспечении
- •4.1. Процесс разработки программного обеспечения в соответствии со стандартом стб исо/мэк 12207-2003
- •4.2. Причины появления ошибок в программном обеспечении
- •5. Модели надежности программного обеспечения
- •5.1. Общие сведения
- •5.2. Модель Джелинского–Моранды
- •5.3. Модель Шика–Волвертона
- •5.4. Геометрическая модель
- •5.5. Статистическая модель Миллса
- •5.6. Модель Нельсона
- •5.7. Статистическое моделирование надёжности программ
- •6. Стандартизация оценки надежности программных средств в Республике Беларусь
- •6.1. Общие сведения о стандартах в области оценки качества программных средств
- •6.2. Оценка надежности программных средств по гост 28195–99
- •6.3. Оценка надежности программных средств по стб исо/мэк 9126–2003
- •1. Определение требований к надежности
- •2. Подготовка к оцениванию
- •3. Процедура оценивания
- •7. Оценка надежности программных средств в соответствии с международными стандартами iso/iec 9126-1-3:2001-2003 и iso/iec 14598-1:1999
- •7.1. Общие сведения о сериях стандартов iso/iec 9126-1-4:2001-2004 и iso/iec 14598-1-6:1998-2001
- •7.2. Модель надежности программных средств по стандарту iso/iec 9126-1:2001
- •7.3. Внутренние метрики надежности программных средств по стандарту iso/iec 9126-3:2003
- •7.4. Внешние метрики надежности программных средств по стандарту iso/iec 9126-2:2003
- •7.5. Метод оценки надежности программных средств по стандарту iso/iec 14598–1:1999
- •1. Установка требований к оценке надежности
- •1.1. Установка цели оценки
- •1.2. Идентификация типов продуктов
- •1.3. Определение модели надежности
- •2. Определение оценки надежности
- •2.1. Выбор метрик надежности
- •2.2. Установка уровней ранжирования метрик
- •2.3. Установка критериев для оценки
- •8. Тестирование программного обеспечения
- •8.1. Введение в тестирование по
- •8.2. Определение тестирования по
- •8.3. Объекты тестирования
- •8.4. Направления тестирования по
- •8.5. Принципы разработки тестов
- •8.6. Информационные потоки процесса тестирования
- •8.7. Принципы организации тестирования
- •8.8. Методы тестирования по
- •8.8.1. Общие сведения
- •8.8.2. Структурное тестирование
- •8.8.2.1. Понятие потокового графа, пути, цикломатической сложности
- •8.8.2.2. Тестирование по критерию путей
- •8.8.2.3. Тестирование по критерию ветвей
- •8.8.2.4. Метод тестирования базисных путей
- •8.8.2.5. Тестирование циклов
- •8.8.3. Функциональное тестирование программного обеспечения
- •8.8.3.1. Общие сведения
- •8.8.3.2. Пример иллюстрации сложности задачи разработки тестов
- •8.8.3.3. Метод эквивалентного разбиения
- •8.8.3.4. Метод анализа граничных условий
- •8.9. Документирование тестов
- •8.10. Методика тестирования программных средств
- •8.10.1. Общие сведения
- •8.10.2. Тестирование модулей
- •8.10.3. Тестирование сборки
- •8.10.3.1. Восходящее тестирование сборки
- •8.10.3.2. Нисходящее тестирование сборки
- •8.10.4. Тестирование правильности
- •8.10.5. Системное тестирование
- •8.11. Пример тестирования программы
- •1) Подготовка процесса
- •4) Анализ требований к программному средству
- •5) Проектирование программной архитектуры
- •6) Техническое проектирование программного средства
- •7) Программирование и тестирование модулей
- •Компонент пользовательского интерфейса:
- •Компонент математического расчёта:
- •8) Сборка программного средства
- •9) Квалификационные испытания программного средства
- •12) Ввод в действие программного средства
- •13) Обеспечение приёмки программного средства
- •8.12. Регрессионное тестирование
- •8.13. Документирование программных ошибок
- •8.14. Мутационное тестирование
- •8.15. Проектирование тестов, основанных на случайных наборах исходных данных
- •8.15.1. Анализ случайных векторов исходных данных
- •8.15.2. Генерация случайных векторов исходных данных
- •8.16. Оценка правильности результатов выполнения программы
- •9. Верификация программного обеспечения
- •9.1. Элементы математической логики Исчисление высказываний
- •Операции над высказываниями
- •(Если a, то b)
- •Исчисление предикатов
- •Операции над высказывательными формами
- •9.2. Метод индуктивных утверждений
- •9.2.1. Общие сведения
- •9.2.2. Последовательность шагов по доказательству корректности схем алгоритмов программ
- •9.3. Основные проблемы доказательства корректности программ
- •Экзаменационные вопросы по дисциплине «Надежность программного обеспечения»
- •1.2. Числовые константы и переменные
- •1.3. Операторы
- •1.4. Функции встроенные и задаваемые пользователем
- •1.5. Математические выражения
- •1.6. Присваивание переменным значений
- •1.7. Ранжированные переменные и таблицы вывода
- •1.8. Понятие о массивах и матрицах
- •1.8.1. Функции, определяемые пользователем, и массивы
- •1.8.2. Индексация элементов массивов
- •1.8.3. Матрицы
- •1.8.4. Нижние индексы и верхние индексы
- •1.8.5. Нижние индексы и элементы вектора
- •1.8.6. Нижние индексы и элементы матрицы
- •1.8.7. Верхние индексы и столбцы матрицы
- •1.8.8. Изменение значения системной переменной origin
- •2. Редактирование
- •2.1. Формульный редактор
- •2.1.1. Наборные панели и шаблоны
- •2.2. Текстовый редактор
- •3. Арифметические и логические операторы
- •3.1. Арифметические операторы
- •3.1.1. Расширенные арифметические операторы
- •3.2. Операторы отношения (логические операторы)
- •3.3. Функция условных выражений if
- •3.4. Задание функций пользователя
- •3.5. Типовые статистические функции
- •4. Решение уравнений
- •4.1. Решение одного уравнения
- •4.2. Решение уравнений с параметром
- •4.3. Системы уравнений
- •4.4. Многократное решение уравнений
- •4.5. Приближенные решения
- •5. Символьная математика
- •5.1. Настройка символьного знака равенства
- •6. Файлы данных
- •6.1. Функции доступа к файлам
- •6.2. Аргументы функций доступа к файлам
- •7. Графики
- •7.1. Создание графика
- •7.2. Вывод функции на график
- •7.3. Построение декартова графика
- •7.4. Графическое представление вектора
- •7.5. Графическое представление файлов данных
- •7.6. Размещение нескольких графиков на чертеже
- •7.7. Форматирование осей
- •7.8. Свойства графиков
- •7.9. Оформление графика
- •7.10. Заголовки графиков
- •7.11. Изменение представления графика
- •7.12. Изменение масштаба на графике
- •7.13. Считывание координат точек графика
- •Приложение 1. Основные законы распределения нсв
- •Приложение 2. Пример выполнения задания
- •Приложение 3. Математические функции
- •Приложение 4. Статистические функции
- •Литература
- •Автоматизация тестирования программного обеспечения. Работа в среде silktest. Теоретические и практические сведения к выполнению индивидуальных практических работ
- •Введение
- •1. Тестирование программного обеспечения
- •1.1. Задача и цели тестирования программного обеспечения
- •1.2. Классификация видов тестирования по
- •1.3. Этапы процесса тестирования по
- •1.4. Разработка тест-кейсов
- •1.5. Контрольные вопросы
- •2. Автоматизация тестирования по
- •2.1. Эффективность автоматизации тестирования
- •2.2. Технология Record&Playback
- •2.3. Язык скриптов
- •2.4. Структура автоматизации тестирования
- •2.5. Требования к автоматизированному тесту
- •2.6. Инструментальные средства автоматизации тестирования
- •2.7. Контрольные вопросы
- •3. Работа в среде SilkTest 8.0
- •3.1. Начало работы
- •3.1.3. Создание тест-кейсов
- •3.2. Реализация технологии Record/PlayBack в среде SilkTest
- •3.2.1. Создание библиотеки объектов
- •3.2.2. Создание тестового скрипта
- •3.2.3. Среда запуска скриптов
- •3.2.4. Средство распознавания объектов
- •3.3. Recovery-система
- •3.4. Создание тестплана (TestPlan)
- •3.4.1. Добавление тесткейса в тестплан
- •3.4.2. Подключение файлов в тестплане
- •3.4.3. Запуск тестплана (полный, выборочный)
- •3.5. Использование внешних данных (Data Driven Test)
- •3.6. Просмотр результатов исполнения тестовых сценариев
- •3.7. Пример разработки теста
- •3.7.1. Задание для тестирования
- •3.7.2. Создание фрейма приложения
- •3.7.3. Настройка Recovery System
- •3.7.4. Запись и воспроизведение скрипта
- •3.7.5. Создание Testcase с использованием Data Driven Test
- •3.7.6. Создание ТестПлана
- •3.8. Задания для лабораторных работ
- •Литература
- •Приложение 1. Описание языка 4test п1.1. Типы данных
- •П1.1.1. Синтаксис определения переменной
- •П1.1.2. Синтаксис определения константы
- •П1.1.3. Примеры определения и инициализации переменных
- •П1.1.4. Массивы данных
- •П1.2. Операторы языка 4Test п1.2.1. Арифметические операторы
- •П1.2.2. Логические операторы
- •П1.2.3. Операторы сравнения
- •П1.2.4. Условные операторы
- •П1.2.5. Операторы цикла
- •П1.2.6. Функции приведения типа
- •П1.2.7. Функции работы с массивами
- •П1.2.8. Функции работы со строками
- •П2.2.2. Функции для Menu (меню)
- •П2.2.3. Функции для ListBox/ComboBox (Раскрывающийся список/ Поле со списком)
- •П2.2.4. Функции для Button (кнопка)
- •П2.2.5. Функции для CheckBox/RadioButton (Флажок/Переключатель)
- •П2.2.6. Функции для EditBox (Поле ввода)
- •П2.2.7. Функция для Тab (Вкладка)
- •П2.3. Функции имитации клавиатурного ввода
- •П2.4. Функции имитации действий, выполняемых мышью
- •П2.5. Функции работы с системой
- •П2.6. Функции оповещения о результатах
- •П2.7. Функции синхронизации
- •П2.8. Функции проверки существования обьекта
- •П2.9. Функции работы с файлами
- •П2.10. Функции пользователя
- •Контрольные работы Контрольная работа № 1 Тема задания
- •Методические указания к выполнению контрольной работы № 1
- •Содержание отчета по контрольной работе № 1
- •Контрольная работа № 2 Тема задания
- •Методические указания к выполнению контрольной работы №2
- •Содержание отчета по контрольной работе № 2
- •Правила оформления отчетов по контрольным работам
- •Образец титульного листа
- •Содержание отчета по индивидуальной практической работе № 1
- •Правила оформления отчетов по индивидуальным практическим работам
- •Образец титульного листа
9.2. Метод индуктивных утверждений
9.2.1. Общие сведения
Верификация ПО заключается в выполнении формального доказательства того, что ПО удовлетворяет своей спецификации.
Общими для различных методов верификации ПО является представление программ в виде схемы алгоритма, с каждой дугой которой соотносится некоторый предикат, называемый утверждением (рис. 9.1).
Если Pi есть утверждение, связанное с входящей дугой оператора V, а Pj – утверждение, связанное с исходящей дугой того же оператора, то тогда необходимо доказать правильность следующего оператора: если Pi истинно и если оператор V выполнен, то утверждение Pj истинно. Такие теоремы имеют следующий вид: Pi→Pj.
Обычный метод их доказательства сводится, например, к тому, чтобы показать, что Pj истинно всякий раз, когда Pi истинно, т.е. для доказательства всей теоремы необходимо доказать, например, истинность Pj. Подобный процесс может быть повторен для каждого оператора программы.
На рис. 9.2 приведена схема алгоритма некоторой программы с предикатами P1 и Pn.
На данном рисунке P1 – утверждение, непосредственно предшествующее входному оператору программы (начальное утверждение), а Pn – утверждение, соответствующее выходному оператору программы (конечное утверждение).
Тогда оператор «если P1 истинно и программа выполнена, то Pn истинно», представляет собой теорему, доказательство которой устанавливает правильность того, что ПО соответствует своим спецификациям (т.е. теорема имеет вид P1→Pn). Таким образом, доказательство правильности программ сводится к доказательству теорем методами исчисления предикатов.
Одним из известных методов доказательства правильности программ является метод индуктивных утверждений, предложенный Флойдом.
Данный метод применим для доказательства правильности или корректности схем алгоритмов. В понятии корректности программ можно выделить два аспекта:
Частичная корректность.
Завершаемость.
Частичная корректность подразумевает соответствие программы своей спецификации.
Завершаемость означает, что выполнение программы закончится при вводе определенных данных в соответствии со спецификацией. Нет общего метода доказательства завершаемости программ, но обычно бывает достаточно неформальных рассуждений.
В методе индуктивных утверждений первый шаг состоит в записи утверждений относительно свойств входных и выходных данных программ, а так же результатов в ряде промежуточных точек называемых точками разреза. Эти утверждения формулируются в логике исчисления предикатов. На основании этих утверждений и семантики операторной схемы программы путем определенных преобразований формулируются верификационные условия, правильность которых необходимо доказать. И если доказывается истинность сформулированных условий, то программа будет корректна относительно входного и выходного утверждений. Если доказать истинность не удается, то либо в ПС есть ошибка, либо в процедуре доказательства есть ошибка, например, неверное утверждение в некоторой точке разреза.
9.2.2. Последовательность шагов по доказательству корректности схем алгоритмов программ
Пример.
Рассмотрим определение результата деления двух натуральных чисел А и В в виде пары чисел «частное» и «остаток», не используя операции умножения и деления.
Обозначим:
СН – частное;
АА – остаток (текущий);
А – делимое;
В – делитель;
R – конечный остаток от деления.
Схема алгоритма деления приведена на рис. 9.3.
Представим алгоритм, приведённый на рис. 9.3, в форме, принятой при верификации программ (рис. 9.4). На рис. 9.4 «←» обозначает операцию присваивания.
Рис. 9.3. Пример алгоритма деления натуральных чисел
Рис. 9.4. Представление алгоритма в форме, принятой при верификации программ
Обычно при доказательстве правильности (корректности) операторы ввода-вывода игнорируется.
Шаги по доказательству корректности программ выглядят следующим образом.
На схеме алгоритма выделяем точки разреза. Всегда будет нулевая точка лежащая на дуге исходящей из вершины “начало” и точки, на каждой дуге ведущей к вершине “конец” алгоритма. Кроме того, вводятся точки разреза как минимум на каждый цикл по одной точке.
На алгоритме выделяем множество путей, при этом путь должен обладать следующими свойствами:
путь должен начинаться и заканчиваться в точке разреза;
путь не должен содержать других точек разреза;
множество всех выделенных путей должно покрывать все ветви алгоритма, т.к. в данной схеме алгоритма 3 ветви, то выделяем 3 следующих пути:
α01 = {«0», 2, «1»};
α11 = {«1», 3, 4, «1»};
α12 = {«1», 3, 5, «2»}.
Формулируем предикаты, т.е. с каждой точкой разреза связывается предикат или некоторое индуктивное утверждение. Назначение предиката состоит в том, чтобы описать соотношение между переменными в этой точке. Это индуктивное утверждение должно обладать тем свойством, что всякий раз, когда исполнение программы достигает данной точки, предикат должен быть истинным для текущих значений входящих в него переменных в данной точке. Входной предикат связывается с начальной точкой разреза программы, а выходной с конечной точкой разреза. Применительно к рассматриваемому примеру (см. рис. 9.4):
Р0: А, В – натуральные числа;
Р1: АА = А – СН * ВВ;
Р2: С = (A – R) / В,
где: АА – это текущий остаток в цикле;
СН – текущее частное;
ВВ – делитель;
R – конечный остаток от деления.
Входное утверждение Р0 (входной предикат) описывает все необходимые входные условия для нашего алгоритма. Выходное утверждение Р2 (выходной предикат) описывает связь выхода с входом, т.е. ожидаемый результат. Предикат Р1 вводится таким образом, чтобы он отражал основные свойства цикла.
Формулируем условия прохождения пути:
α01: W01 = истина;
α11: W11 = AA ≥ BB;
α12: W12 = AA < BB.
Строим для каждого пути αij, ведущего из точки разреза i в точку j, некоторое верификационное условие
α01: [P0 ^ W01]→[P1]; (9.1)
α11: [P1 ^ W11]→[P1]; (9.2)
α12: [P1 ^ W12]→[P2]. (9.3)
Cуть метода заключается в демонстрации того, что из входного утверждения P0 и преобразование выполняемого на данном пути следует утверждение, сформулированное в конце пути, например в точке “1” и так вплоть до выходного утверждения P2.
Доказательство корректности верификационных условий. Все три условия имеют вид p→q. Обычный метод доказательства таких утверждений сводится к тому, чтобы показать, что q истинно всякий раз, когда истинно p , т.е. нужно доказать истинность q при условии истинности p.
Докажем истинность предложения (9.1) для пути α01:
Подставляем в предикат P1 значения переменных после выполнения блока 2 схемы алгоритма (рис 9.4):
А = А – 0 * В следовательно А = А (истинно).
Таким образом, всё предложение истинно. Докажем истинность предложения (9.2) для пути α11:
Чтобы доказать истинность предиката в конце пути (точка разреза «1»), достаточно доказать:
истинность P1 при первом попадании в точку «1»;
истинность P1(n+1) при условии, что справедливо P1(n), где n – параметр цикла.
Таким образом, необходимо доказать истинность предложения
P1(n) → P1(n+1),
т.е. при условии, что P1(n) – истинно, доказать, что P1(n+1) – истинно, и таким образом, P1(n) будет истинным для любого значения n.
Докажем истинность предиката P1 при первом попадании в точку разреза «1», т.е. докажем истинность предложения (9.4):
Таким образом, истинность предложения (9.4) на первой итерации доказана.
Пусть P1 истинно на n-й итерации:
AA – n*BB = A – (CH+n)*BB.
Докажем истинность на (n+1)-ой итерации:
AA – (n+1)*BB = A – (CH+n+1)*BB;
AA – n*BB – BB
= A – (CH+n)*BB – BB;
AA – n*BB = A – (CH+n)*BB.
Таким образом, истинность на (n+1)-ой итерации доказана, и таким образом, предложение (9.4) истинно для любого n в рамках ограничений предложения (9.4).
Докажем истинность предложения (9.3) на пути α12:
Подставляем в предикат P2 значения переменных после выполнения блока 5 схемы алгоритма (см. рис. 9.4):
CH = (A – AA)/B;
AA = A – CH*B.
Так как B ≡ BB (нигде не менялось), то получаем предикат P1, истинность которого доказана (по условию):
AA = A – CH*BB.
Поэтому предложение (9.3) истинно.
Данный подход позволяет обнаруживать ошибки. Например, внесём ошибку в блок 2 схемы алгоритма (см рис. 9.4):
(AA, BB, CH) ← (A, B, 1).
Тогда
α01: [(A, B: натуральные числа) ^ истина] → [AA = A – CH*BB];
A = A – 1*B;
A ≠ A – B (ошибка).
Таким образом, мы доказали, что схема алгоритма правильна по отношению к входному и выходному утверждению Р0 и Р2 , но то что программа не будет находиться в бесконечном цикле еще не доказано. Нет общего метода доказательства завершаемости программ, но обычно бывает достаточно неформальных рассуждений. В нашем случае алгоритм заканчивается только тогда, когда AA < BB. Согласно входному утверждению Р0, АА первоначально положительно и уменьшается при каждом повторении цикла на положительное число равное ВВ. Т.о. неформально установлено, что выполнение программы закончится.
Из анализа данного примера видно, что доказательство правильности весьма трудоемкий процесс и доказательство всегда длиннее самой программы.
