Тестирование программы
Структурное тестирование программного обеспечения методом «черного» ящика.
Тестирование — процесс выполнения программы с целью обнаружения ошибок. Шаги процесса задаются тестами.
Каждый тест определяет:
1. Свой набор исходных данных и условий для запуска программы;
2. Набор ожидаемых результатов работы программы.
Другое название теста — тестовый вариант. Полную проверку программы гарантирует исчерпывающее тестирование. Оно требует проверить все наборы исходных данных, все варианты их обработки и включает большое количество тестовых вариантов. Увы, но исчерпывающее тестирование во многих случаях остается только мечтой — срабатывают ресурсные ограничения (прежде всего, ограничения по времени).
Хорошим считают тестовый вариант с высокой вероятностью обнаружения еще не раскрытой ошибки. Успешным называют тест, который обнаруживает до сих пор не раскрытую ошибку.
Целью проектирования тестовых вариантов является систематическое обнаружение различных классов ошибок при минимальных затратах времени и стоимости.
Важен ответ на вопрос: что может тестирование?
Тестирование обеспечивает:
1. обнаружение ошибок;
2. демонстрацию соответствия функций программы ее назначению;
3. демонстрацию реализации требований к характеристикам программы;
4. отображение надежности как индикатора качества программы.
А чего не может тестирование? Тестирование не может показать отсутствия дефектов (оно может показывать только присутствие дефектов). Важно помнить это (скорее печальное) утверждение при проведении тестирования.
Рассмотрим информационные потоки процесса тестирования. Они показаны на рис. 1.
Рисунок 4.1 – Информационные потоки процесса тестирования
На входе процесса тестирования три потока:
1. Текст программы;
2. Исходные данные для запуска программы;
3. Ожидаемые результаты.
Выполняются тесты, все полученные результаты оцениваются. Это значит, что реальные результаты тестов сравниваются с ожидаемыми результатами. Когда обнаруживается несовпадение, фиксируется ошибка — начинается отладка. Процесс отладки непредсказуем по времени. На поиск места дефекта и исправление может потребоваться час, день, месяц. Неопределенность в отладке приводит к большим трудностям в планировании действий.
После сбора и оценивания результатов тестирования начинается отображение качества и надежности ПО. Если регулярно встречаются серьезные ошибки, требующие проектных изменений, то качество и надежность ПО подозрительны, констатируется необходимость усиления тестирования. С другой стороны, если функции ПО реализованы правильно, а обнаруженные ошибки легко исправляются, может быть сделан один из двух выводов:
1. качество и надежность ПО удовлетворительны;
2. тесты не способны обнаруживать серьезные ошибки.
В конечном счете, если тесты не обнаруживают ошибок, появляется сомнение в том, что тестовые варианты достаточно продуманы и что в ПО нет скрытых ошибок. Такие ошибки будут, в конечном итоге, обнаруживаться пользователями и корректироваться разработчиком на этапе сопровождения (когда стоимость исправления возрастает в 60-100 раз по сравнению с этапом разработки).
Результаты, накопленные в ходе тестирования, могут оцениваться и более формальным способом. Для этого используют модели надежности ПО, выполняющие прогноз надежности по реальным данным об интенсивности ошибок.
Существуют 2 принципа тестирования программы:
1. функциональное тестирование (тестирование «черного ящика»);
2. структурное тестирование (тестирование «белого ящика»).
Понятие о структурном программировании.
Структурное тестирование называют также тестированием по «маршрутам», так как в этом случае тестовые наборы формируют путем анализа маршрутов, предусмотренных алгоритмом. Под маршрутами при этом понимают последовательности операторов программы, которые выполняются при конкретном варианте исходных данных.
В основе структурного тестирования лежит концепция максимально полного тестирования всех маршрутов программы. Так, если алгоритм программы включает ветвление, то при одном наборе исходных данных может быть выполнена последовательность операторов, реализующая действия, которые предусматривает одна ветвь, а при втором - другая. Соответственно, для программы будут существовать маршруты, различающиеся выбранным при ветвлении вариантом.
Считают, что программа проверена полностью, если с помощью тестов удается осуществить выполнение программы по всем возможным маршрутам передач управления. Однако нетрудно видеть, что даже в программе среднего уровня сложности число неповторяющихся маршрутов может быть очень велико, и, следовательно, полное или исчерпывающее тестирование маршрутов, как правило, невозможно.
Структурный подход к тестированию имеет ряд недостатков. Так тестовые наборы, построенные по данной стратегии:
• не обнаруживают пропущенных маршрутов;
• не обнаруживают ошибок, зависящих от обрабатываемых данных;
• не дают гарантии, что программа правильна, например, если вместо сортировки по убыванию реализована сортировка по возрастанию.
Для формирования тестов программу представляют в виде графа, вершины которого соответствуют операторам программы, а дуги представляют возможные варианты передачи управления. Ниже приведен текст программы, которая определяет значение х в зависимости от значений параметров процедуры.
Тестовые требования:
1. Проверить, что для графы «Номер» функция записи возвращает правильное значение.
2. Проверить, что программа проверяет тип записываемых данных в графу «Номер».
3. Проверить, что для графы «Фирма» функция записи возвращает правильное значение.
4. Проверить, что для графы «Фамилия» функция записи возвращает правильное значение.
5. Проверить, что для графы «Имя» функция записи возвращает правильное значение.
6. Проверить, что для графы «Отчество» функция записи возвращает правильное значение.
7. Проверить, что для графы «Адрес» функция записи возвращает правильное значение.
8. Проверить, что для графы «Телефон» функция записи возвращает правильное значение.
9. Проверить, что программа проверяет тип записываемых данных в графу «Телефон».
10. Проверить, что при нажатии кнопки «Добавить», функция производит правильные действия, и данные корректно добавляются в таблицу.
11. Проверить, что при нажатии кнопки «Сохранить» функция производит правильные действия.
12. Проверить, что при нажатии кнопки «Удалить» функция очищает выбранную строку таблицы, не затрагивая другие данные.
Таблица 3 – Результаты тестирования.