Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
74
Добавлен:
10.02.2015
Размер:
289.79 Кб
Скачать

V. Тестирование и отладка

Тестирование — процесс выполнения программ с целью обнаружения факта наличия ошибок. Это классическое определение тестирования, принадлежащее Гленфорду Майерсу. Обратим внимание, в определении указан лишь один способ проведения тестирования. Существуют и методы ручного тестирования (например, инспекции и сквозные просмотры программ). Поэтому слова «...процесс выполнения программ...» разумно заменить на «… любая деятельность, выполняемая...».

Отладка — процесс локализации и устранения ошибок.

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

Тестирование программных продуктов

Существуют две основные стратегии тестирования.

Тестирование программы как черного ящика, при котором программа рассматривается как объект, внутренняя структура которого неизвестна.

Тестирование программы как прозрачного (белого) ящика подразумевает знание исходного кода программы и полный доступ к нему.

Существуют также разновидности тестирования.

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

Стохастическое тестирование, при котором исходные тестовые данные берутся случайным образом, как правило, с использованием статистического распределения.

Ручное тестирование, которое проводится без исполнения тестируемой программы на компьютере.

Типичные ошибки

Категории наиболее распространенных ошибок программистов.

  • Ошибки общего (несинтаксического) характера, остающиеся в программах после выполнения синтаксического контроля.

  • Группа логических ошибок. Например, неполный учет возможных условий или неверное указание ветви алгоритма после проверки условия.

  • Ошибки в циклах. Например, неверные границы начала и конца.

  • Ошибки при работе с данными.

  • Ошибки ввода-вывода.

  • Ошибки в описании переменной. Например, отсутствие инициализации переменной.

  • Ошибки при работе с массивами.

  • Отсутствие начального обнуления элементов.

    • Ошибки специального вида, особенно трудные для диагностирования.

  • Ошибки при написании параллельных программ. Например, ошибки в расстановках семафоров.

  • Ошибки, связанные с применением препроцессора.

  • Ошибки, связанные с неправильным результатом операций.

  • Исчезающие ошибки.

    • Тестовые данные

Для тестирования программ методом черного ящика [Канер, Фолк, Нгуен 2000] готовятся определенные группы тестов.

    • Для тестирования классов эквивалетностей. Классы эквивалентноепозволяют вместо большого количества тестов использовать лишь их небольшое подмножество. Каждый тест представляет набор тестов, на которых программа ведет себя одинаково. Существует два основных типаклассов эквивалентностей.

    • Класс корректных тестовых случаев, отражающих типичную "нормальную" ситуацию.

    • Класс тестов, содержащих ненормальную ситуацию, т. е. описывающих ситуацию, которой быть не должно.

    • Для тестирования граничных значений.

    • Для анализа причинно-следственных связей. Эти тесты применяются для программ, в которых взаимодействуют объекты.

    • Для тестирования тех утверждений, которые приводятся вдокументации.

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

  • использование справочников;

  • вычисление вручную;

  • использование результатов, полученных при помощи другой программы, которой мы доверяем.

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

Особый важный класс составляют тесты, измеряющие производительность. Существуют специальные группы и компании, которые разрабатывают такие тесты.

Тестирование программ в процессе разработки

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

  • Тестирование сверху вниз. Применяется, если программа разрабатывает сверху вниз. В данном случае используются "заглушки" — фрагмент кода, имитирующие еще не написанные части программы.

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

Отслеживание ошибок

Проблема или ошибка может быть рассмотрена как некоторый объект в системе, который может находиться в одном из восьми состояний.

  • Проблема или ошибка зарегистрирована.

  • Выполнен первичный анализ (эксперт подтвердил факт наличия ошибки).

  • Понятна причина, вызвавшая ошибку.

  • Выполнен окончательный анализ проблемы или ошибки.

  • Принято решение о начале работы над исправлением.

  • Выполнено исправление ошибки.

  • Исправление интегрировано в основное пространство.

  • Подтверждено исправление ошибки.

Отладка программных продуктов

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

  1. Следует начать с изучения уже доступных исходных и результирующих данных.

  2. Сформулировать некоторую гипотезу, которая объясняет получение таких результирующих данных.

  3. Подготовить новые исходные данные и провести эксперимент, который позволит доказать или опровергнуть гипотезу.

Обратим особое внимание на два достаточно простых случая отладки. Их анализ может быть достаточно легко выполнен при помощи пошагового отладчика:

  • Если программа прекращает работу с порождениями "предсмертного дампа памяти", то практически любой отладчик позволит по этому дампу восстановить динамический стек вызовов процедур и локализовать место проблемы.

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

Соседние файлы в папке Лекции разработка ПО