5.1. Тестированиеиотладкапрограмм. Надежность программногообеспечения
5.1.1. Терминыиопределения
Выполнение программы с целью обнаружения ошибок (табл. 5.1) называется тестированием. Локализация и исправление ошибок называется отладкой [31.
Таблица 5.1. Виды программных ошибок и способы их обнаружения
Вилы программных ошибок |
Способы их обнаружения |
Синтаксические |
Статический контроль и диагностика компиляторами и компоновщиком |
Ошибки выполнения, выявляемые автоматически: а) переполнение, зашита памяти; б) несоответствие типов; в) зацикливание |
Динамический контроль: аппаратурой процессора run-time системы программирования операционной системой — по превышению лимига времени |
Программа не соответствует спецификации |
Целенаправленное тестирование |
Спецификация не соответствует требованиям |
Испытания, бета-тестирование |
Эффективность контроля 1-го вида зависит и от языка, и от компилятора. Контроль 2-го вида осуществляется с помощью исключений — Exceptions — и весьма полезен для проверки
126 Глава 5. Опиадка, тестирование, сопровождение программ
правдоподобности промежуточных результатов. Тест — это набор контрольных входных данных совместно с ожидаемыми результатами. В число входных данных времязависимых программ входят события и временные параметры. Ключевой вопрос — полнота тестирования: какое количество каких тестов гаранти-pyei возможно более полную проверку программы? Исчерпывающая проверка на всем множестве входных данных недостижима. Пример: программа, вычисляющая функцию двух переменных: Y=f(X, Z). Если А", )'. Z — real, то полное число тестов (233)2 = 2м * 10". Если на каждый тест тратить I мс, то 2 мс - 800 млн лет. Следовательно:
• в любой нетривиальной программе на любой стадии ее готовности содержатся необнаруженные ошибки;
• тестирование - технико-экономическая проблема, основанная на компромиссе время — полнота. Поэтому нужно стремиться к возможно меньшему количеству хороших тестов с желательными свойствами.
Детективность: тест должен с большой вероятностью обнаруживать возможные ошибки.
Покрывающая способность: один тест должен выявлять как можно больше ошибок.
Воспроизводимость: ошибка должна выявляться независимо от изменяющихся условий (например, от временных соотношений) -- это трудно достижимо для времязависимых программ, результаты которых часто нсвоспроизводимы.
Только на основании выбранного критерия можно определить гот момент времени, котла конечное множество тестов окажется достаточным для проверки программы с некоторой полнотой (степень полноты, впрочем, определяется экспериментально). Используются два вида критериев (табл. 5.2):
• функциональные тесты составляются исходя из спецификации программы:
• структурные тесты составляются исходя из текста программы.
На рис. 5.1, а видно отличие тестирования команд (достаточен один тест) от О (необходимы два теста, как минимум). Рис. 5.1, б иллюстрирует различие О (достаточно двух тестон. покрывающих пути 1, 4 или 2, 3) от С2 (необходимо четыре теста для всех четырех путей). С2 недостижим в реальных програм-
127 |
5.1. Тестирование и отладка программ...
Таблица 5.2. Виды критериев и их функциональность
Вид критерия |
Функциональность тестов |
i Функциональные |
|
[Тестирование классов входных данных |
Содержать представителей всех классов входных или выходных классов и точки на границах классов |
Тестирование классов выходных данных |
|
Тестирование функций |
Каждая функция внешнего интерфейса должна быть проверена 1 раз и более |
Структурные |
|
Тестирование команд |
Каждая команда (оператор) должна быть выполнена 1 раз и более |
Критерий CI — тестирование ветвей |
Каждая ветвь должна быть выполне на i раз и более |
Критерий С2 — тестирование путей |
Каждый путь в графе программы должен быть выполнен 1 раз и боле |
Путь 1 Путь 2 Путь 3 Путь 4
Ветвь 2
Рис. 5.1. Траектории вычислений при структурном тестировании:
а — тестирование команд и ветвей; б — тестирование ветвей и путей
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.