- •Качество и надежность программного обеспечения
- •Лекция 1. Введение. Основные стандарты и термины по качеству программного обеспечения. Метрики и критерии качества программных продуктов. Составляющие качества программных продуктов.
- •Общие термины
- •Лекция 2. Классификация видов сложности программных продуктов. Метрические характеристики программ по м.Холстеду
- •Оценивание качества разработки программ на основе метрик Холстеда. Измеримые свойства алгоритмов
- •Длина программы
- •4. Объем программы
- •Потенциальный объем V*
- •Лекция 3. Уровень программ. Интеллектуальное содержание программы.
- •1. Уровень программы
- •2. Вывод уравнения уровня программы
- •3. Определение интеллектуального содержания программ
- •Лекция 4. Работа в программировании. Уровни языков программирования. Метрика числа ошибок в программе.
- •5 S 20 в сек
- •Значение уровня языка
- •Лекция 5. Метрики структурной сложности программ.
- •Где pi – количество вершин ветвления в I-том маршруте без учета последней вершины
- •M5 1 – 3 – 4 – 6 – 8 – 14 независимые
- •Лекция 6. Методы и средства измерения характеристик программ. Аппаратные измерительные мониторы.
- •Лекция 7. Программные измерительные мониторы.
- •Лекция 8. Понятие корректности программ.
- •II. Эталоны и методы проверки корректности.
- •Лекция 9. Аналитическая проверка корректности программ. Верификация программ.
- •Invk (x1, … , xn),
- •Invt1 (x1, … , xn): p ; invt2 (x1, … , xn): q ; invt3 (x1, … , xn) ; … ,
- •U: invr(x1, … , xn) u0
- •Лекция 10. Тестирование программных продуктов
- •1. Основные понятия процесса тестирования
- •2. Объекты тестирования
- •3. Категории тестов для различных объектов тестирования
- •Лекция 11. Виды, критерии и методы тестирования. Методы структурного тестирования программ
- •1. Тестирование на основе потока управления
- •2. Тестирование на основе потока данных
- •Лекция 12. Методы функционального тестирование программных продуктов
- •1. Метод эквивалентного разбиения
- •1.1. Выделение классов эквивалентности
- •1.2. Построение теста
- •2. Анализ граничных значений
- •3. Метод функциональных диаграмм
- •4. Метод, основанный на предположении об ошибке
- •Лекция 13. Основные показатели надежности программного обеспечения (по). Математические модели оценки надежности по.
- •13.1. Основные показатели надежности программного обеспечения (по).
- •13.2. Математические модели оценки надежности по.
- •Модель Джелинского-Моранды.
- •Модель Шика-Уолвертона.
- •Лекция 14. Модели, основанные на методе "посева" и разметки ошибок, и модели на основе учета структуры входных данных
- •Модель Нельсона. Применение последовательного анализа Вальда для снижения количества прогонов программы.
- •Лекция 15. Методы повышения надежности программ и оценка эффективности их применения.
- •15.1 Влияние избыточности на повышение надежности программ
- •Эффективность применения избыточности для повышения надежности комплексов программ
- •Влияние оперативного контроля и восстановления на производительность эвм.
- •Методы программного восстановления
- •Методы обеспечения надежности комплексов программ при сопровождении
- •Литература
Где pi – количество вершин ветвления в I-том маршруте без учета последней вершины
m1 1 - 2 - 14 = 1
m2 1 - 3 - 4 - 6 - 8 - 6 - 8 - 14 = 5
m3 1 - 3 - 5 - 7 - 9 - 10 - 11 - 12 - 13 - 14 = 5
m4 1 - 3 - 4 - 5 - 7 - 9 - 10 - 9 - 10 - 11 - 7 - 9 - 10 - 11 - 12 - 14 = 9
20
Таким образом, сложность программы, представленной графом на рис.3, составляет некоторую метрику в 20 единиц.
Недостаток первого критерия: не учитывается комбинаторика сочетания условий на разных участках маршрутов (например, при сочетаниях ветвлений в вершинах 3 и 12).
Критерий 2. Основан на анализе базовых маршрутов в программе, формируемых и оцениваемых на основе цикломатического числа графа потока управления программы (см. работы Т.МcCabe и В.В.Липаева).
Цикломатическое число Z исходного графа программы определяется формулой
Z = Y - N +2*,
где Y – общее число дуг в графе
N – общее число вершин в графе
– число связных компонент графа.
Число связных компонент графа равно количеству дуг, необходимых для превращения исходного графа в максимально связный граф.
Максимально связным графом называется граф, у которого любая вершина доступна из любой другой вершины.
Максимально связный граф получается из исходного графа путем замыкания конечных и начальной вершин. Для большинства корректных (не содержащих висячих и тупиковых вершин) графов достаточно одной замыкающей дуги.
Для рассматриваемого графа максимально связанный граф получается путем добавления дуги (14, 1)
Z = Y - N + 2P = 20 - 14 + 21 = 8
Второй критерий (выбранный по цикломатическому числу) требует однократной проверки или тестирования каждого линейно-независимого цикла и каждого линейно-независимого ациклического участка программы. Каждый линейно-независимый ациклический маршрут или цикл отличается от всех остальных хотя бы одной вершиной или дугой, т.е. его структура не может быть полностью образована компонентами других маршрутов.
При использовании второго критерияколичество проверяемых маршрутов равно цикломатическому числу.
m1 6 – 8
m2 9 – 10 Линейно-независимые циклические маршруты
m3 7 – 9 – 10 – 11
m4 1 – 2 – 14 Линейно-
M5 1 – 3 – 4 – 6 – 8 – 14 независимые
m6 1 – 3 – 5 – 7 – 9 – 10 – 11 – 12 – 14 ациклические
m7 1 – 3 – 4 – 5 – 7 – 9 – 10 – 11 – 12 – 13 – 14 маршруты
m8 1 – 3 – 4 – 5 – 7 – 9 – 10 – 11 – 12 – 14
Определение структурной сложности по второму критерию:
m1 6 - 8 = 1
m2 9 - 10 = 1
m3 7 - 9 - 10 – 11 = 2
m4 1 - 2 – 14 = 1
m5 1 - 3 - 4 - 6 - 8 – 14 = 4
m6 1 - 3 - 5 - 7 - 9 - 10 - 11 - 12 – 14 = 5
m7 1 - 3 - 4 - 5 - 7 - 9 - 10 - 11 - 12 – 14 = 6
m8 1 - 3 - 4 - 5 - 7 - 9 - 10 - 11 - 12 - 13 – 14 = 6
26
Для правильно структурированных программ (программ, которые не имеют циклов с несколькими выходами, не имеют переходов внутрь циклов или условных операторов и не имеют принудительных выходов из внутренней части циклов или условных операторов) цикломатическое число Z можно определить путем подсчета числа вершин nв, в которых происходит ветвление. Тогда
Z = nв +1
Для рассматриваемого примера Z = 7 + 1 = 8 (ветвления имеют место в вершинах графа 1, 3, 4, 8, 10, 11, 12).
Исследования графов реальных программных модулей с достаточно большим фиксированным числом вершин показали, что:
Суммарная сложность тестов почти не зависит от детальной структуры графа и в основном определяется числом предикатов – ветвлений графа;
При неизменном числе вершин в широких графах имеется большее количество маршрутов, чем в узких графах, но маршруты в среднем короткие. В узких графах число маршрутов сокращается по сравнению с широкими, но маршруты становятся длиннее. В результате величина S2 при изменении структуры графов изменяется меньше, чем цикломатическое число и сильнее коррелирована с числом вершин.
В.В. Липаев показал, что для Z 10 модули корректно проверяемы и число ошибок в таких модулях будет минимальным. Приемлемыми значениями Z считаются 10 Z 30. При Z > 30 устранить ошибки в процессе тестирования практически невозможно.
Для автоматического анализа графов по второму критерию с помощью ЭВМ используются матрицы смежности и достижимости графов.
Матрица смежности – это квадратная матрица, в которой 1 располагается в позиции (i, j), если в графе имеется дуга (i, j).
Для рассматриваемого графа программы матрица смежности имеет вид, показанный в табл.7.
Таблица 7
-
1
2
3
4
5
6
7
8
9
100
11
12
13
14
1
2
1
3
1
4
1
5
1
1
6
1
1
7
1
1
8
1
9
1
1
10
1
11
1
12
1
13
1
14
1
1
1
1
Матрицей достижимости называется квадратная матрица, в которой 1 располага-ется в позиции, соответствующей дуге (i, j). Для рассматриваемого графа программы матри-ца достижимости имеет вид, показанный в табл.8.
Таблица 8
-
1
2
3
4
5
6
7
8
9
100
11
12
13
14
1
2
1
3
1
4
1
1
5
1
1
1
6
1
1
1
1
1
7
1
1
1
1
1
1
1
1
8
1
1
1
1
1
9
1
1
1
1
1
1
1
1
10
1
1
1
1
1
1
1
1
11
1
1
1
1
1
1
1
1
12
1
1
1
1
1
1
1
1
13
1
1
1
1
1
1
1
1
1
14
1
1
1
1
1
1
1
1
1
1
1
1
1
Матрица достижимости является основной для вычисления маршрутов по второму критерию. Используя ЭВМ, матрицу достижимости можно получить из матрицы смежности путем возведения ее в степень, величина которой равна числу вершин без последней в исходном графе.
С помощью матрицы достижимости можно сравнительно просто выделить циклы, отмечая диагональные элементы, равные 1, и идентичные строк.
Для рассматриваемого примера одинаковыми являются строки 6 и 8, которые имеют 1 на диагонали, следовательно, вершины 6 и 8 образуют цикл. Аналогично можно выделить еще два маршрута с циклами, образованными вершинами 9 и 10 и 7, 9, 10 и 11 соответственно.
Более сильные критерии проверки и определения сложности структуры программы включают требования однократной проверки не только линейно-независимых, но и всех линейно-зависимых циклов и ациклических маршрутов.
Критерий 3. Этот критерий основан на выделении полного состава базовых структур графа программы и заключается в анализе хотя бы один раз каждого из реальных ациклических маршрутов исходного графа программы и каждого цикла, достижимого из всех этих маршрутов.
Если из некоторого ациклического маршрута исходного графа достижимы несколько элементарных циклов, то при тестировании должны исполняться все достижимые циклы.
Для рассматриваемого примера по данному критерию необходимо исполнить 6 ациклических маршрутов и 5 маршрутов, из которых достижимы элементарные циклы.
m1 1 – 2 – 14
m2 1 – 3 – 4 – 6 – 8 – 14
m3 1 – 3 – 5 – 7 – 9 – 10 – 11 – 12 – 14
m4 1 – 3 – 4 – 5 – 7 – 9 – 10 – 11 – 12 – 14
m5 1 – 3 – 5 – 7 – 9 – 10 – 11 – 12 – 13 – 14
m6: 1 – 3 – 4 – 5 – 7 – 9 – 10 – 11 – 12 – 13 – 14
m7 1 – 3 – 4 – 6 – 8 – 6 – 8 – 14
m8: 1 – 3 – 5 – 7 – 9 – 10 – 9 – 10 – 11 – 7 – 9 – 10 – 11 – 12 – 14
m9: 1 – 3 – 4 – 5 – 7 – 9 – 10 – 9 – 10 – 11 – 7 – 9 – 10 – 11 – 12 – 14
m10: 1 – 3 – 5 – 7 – 9 – 10 – 9 – 10 – 11 – 7 – 9 – 10 – 11 – 12 – 13 – 14
m11: 1 – 3 – 4– 5 – 7 – 9 – 10 – 9 – 10 – 11 – 7 – 9 – 10 – 11 – 12 – 13 – 14
Определим структурную сложность заданной программы по третьему критерию:
m1 1 - 2 - 14 = 1
m2 1 - 3 - 4 – 6 – 8 – 14 = 4
m3 1 - 3 - 5 - 7 - 9 - 10 - 11 - 12 - 14 = 5
m4 1 - 3 - 4 - 5 - 7 - 9 - 10 - 11 - 12 – 14 = 6
m5 1 - 3 - 5 - 7 - 9 - 10 - 11 - 12 - 13 - 14 = 5
m6: 1 - 3 - 4 - 5 - 7 - 9 - 10 - 11 - 12 - 13 – 14 = 6
m7 1 - 3 - 4 - 6 - 8 - 6 - 8 - 14 = 5
m8: 1 - 3 - 5 - 7 - 9 - 10 - 9 - 10 - 11 - 7 - 9 - 10 - 11 - 12 – 14 = 8
m9: 1 - 3 - 4 - 5 - 7 - 9 - 10 - 9 - 10 - 11 - 7 - 9 - 10 - 11 - 12 – 14 = 9
m10: 1 - 3 - 5 - 7 - 9 - 10 - 9 - 10 - 11 - 7 - 9 - 10 - 11 - 12 – 13 – 14 = 8
m11: 1 - 3 - 4 - 5 - 7 - 9 - 10 - 9 - 10 - 11 - 7 - 9 - 10 - 11 - 12 – 13 – 14 = 9
S2 = 1 + 4 + 5 + 6 + 5 + 6 + 5 + 8 + 9 + 8 + 9 = 66
Особенностью четырех последних маршрутов с циклами, так же как соответствующих им ациклических маршрутов, является полный перебор сочетаний ветвлений в вершинах 3 и 12.
Приведенные критерии для оценки сложности программных модулей характеризуют в каждом случае минимально необходимые величины проверок по каждому критерию. Для проверки реальных программ это количество проверок может быть недостаточно (например, циклы желательно проверять на одном-двух промежуточных значениях, а также на максимальном и минимальном количествах исполнения циклов). Оценить достаточность проверок программы значительно труднее, так как при этом, кроме сложности структуры, необходимо анализировать сложность преобразования каждой переменной во всем диапазоне ее изменения и при сочетаниях с другими переменными.