Файл: Отладка и тестирование программ: основные подходы и ограничения (Методы тестирования).pdf
Добавлен: 28.03.2023
Просмотров: 142
Скачиваний: 2
СОДЕРЖАНИЕ
ГЛАВА 1 СУЩНОСТЬ ТЕСТИРОВАНИЯ И ОТЛАДКИ. МЕТОДИКА ВЫЯВЛЕНИЯ ОШИБОК
1.1 Определение понятий «тестирование» и «отладка»
1.3 Сущность и методика отладки программ. Виды ошибок
ГЛАВА 2. ПРИКЛАДНОЕ ЗНАЧЕНИЕ ТЕСТИРОВАНИЯ И ОТЛАДКИ
2.1 Два важных инструмента в отладке приложений
2.2 Применение точек остановки и модификация локальных переменных
ВВЕДЕНИЕ
При разработке учебных планов программистских факультетов большинства вузов подразумевается, что студенты-первокурсники уже умеют программировать. Однако, в школах, зачастую, не делается акцент на таких важных вопросах, как тестирование и отладка. Специалисты-профессионалы знают, что затраты на тестирование и отладку оцениваются в 50–60% всех затрат на разработку программы[1]. В общем смысле выражение «написать программу» означает написать программный код без ошибок трансляции. Зачастую вопрос проверки соответствия программы поставленной задаче, поиска и исправления смысловых ошибок не поднимается в принципе. По большему счету это может происходить в силу отсутствия понятной и однозначной методики тестирования и отладки программ. [1]
Специалист с определённым опытом в сфере прикладного программирования знает, что невозможно выявить и показать абсолютное отсутствие каких-либо ошибок в программе. Вернее будет определить процесс тестирования и отладки как завершающий этап создания программного продукта, заключающийся в выполнении программы с целью выявления сбоев и ошибок программного кода. Так, вместо того, чтобы гарантировать отсутствие ошибок в новой программе, разумней будет продемонстрировать их наличие. В случае корректной работе приложения на фоне выполнения множества различных тестов, имеется некоторая уверенность, но это не гарантирует отсутствие ошибок, а лишь показывает, что пока неизвестно, в каких случаях программа может дать сбой. Такая ситуация иллюстрирует один из принципов тестирования, называемый «парадоксом тестирования». Он гласит, что если одинаковые тесты повторяются снова и снова, то в конце концов один и тот же набор тест кейсов не будет больше находить ошибки в программе.
Очень сложно внести в программу надежность в результате тестирования; она определяется правильностью этапов проектирования и наилучшим решением будет – с самого начала не совершать ошибок на этапе создания программы. Роль тестирования и отладки здесь заключается в определении места тех немногих ошибок, которые присутствуют в грамотном программном продукте.
Тестирование и отладка на сегодняшний день имеют большое значение в жизненном цикле программного обеспечения. Масса возможных и существующих ошибок, начиная от написания программного кода и заканчивая классификацией входных и выходных данных, корректной реализацией различных функций может и должна быть предотвращёна на ранних этапах внедрения программы в производственный цикл. Применение тестирования при разработке программного продукта может позволить предотвратить ряд проблем в процессе написания программы, а отладка позволяет достичь необходимых заказчиком или организацией показателей путём периодического исправления выявленных на этапе тестирования ошибок.
Целью настоящей работы является изучение основных подходов и ограничений в отладке и тестировании программ.
Данная цель может быть достигнута посредством следующих задач:
- определить суть понятий «тестирование» и «отладка»;
- изучить методики выявления ошибок;
- изучить методики исправления ошибок;
- провести практическое исследование на предмет отладки приложений в среде Delphi.
Предмет исследования – совокупность связей между процессами тестирования и отладки программного обеспечения.
За основу литературного обзора взяты методические пособия профильных вузов по предмету работы. В работе также были использованы монографии по теме, рецензируемые источники периодической печати и их электронные версии в сети Интернет.
ГЛАВА 1 СУЩНОСТЬ ТЕСТИРОВАНИЯ И ОТЛАДКИ. МЕТОДИКА ВЫЯВЛЕНИЯ ОШИБОК
«Единственная ошибка - не исправлять своих прошлых ошибок».
Конфуций
1.1 Определение понятий «тестирование» и «отладка»
Большая часть работы программистов связана с написанием исходного кода, тестированием и отладкой программ на одном из языков программирования. [1][2].
Программа – это последовательность команд компьютера, приводящая к решению задачи. Программа является результатом интеллектуального труда, для которого характерно творчество. Хотя программирование в значительной степени искусство, тем не менее, можно систематизировать и обобщить накопленный профессиональный опыт. [2] Проектирование и разработку программ целесообразно разбить на ряд последовательных этапов: 1) постановка задачи; 2) проектирование программы; 3) построение модели; 4) разработка алгоритма; 5) написание программы; 6) отладка программы; 7) тестирование программы; 8) документирование[3].
Программирование - в широком смысле представляет собой все технические операции, необходимые для создания программы, включая анализ требований и все стадии разработки и реализации. В узком смысле - это кодирование и тестирование программы в рамках некоторого конкретного проекта[4].
Тестирование — это выполнение программы с целью обнаружения факта наличия в программе ошибки. [3]
Отладка — это определение места ошибки и внесение исправлений в программу[5]. Исходя из определений данных терминов, между ними существует прямая взаимосвязь, а, следовательно, и необходимость их выполнения на завершающих этапах разработки программы. [1]
Тестирование и отладка тесно связаны с понятием «жизненный цикл программного обеспечения». Это весь период времени существования системы программного обеспечения, начиная от выработки первоначальной концепции этой системы и кончая ее моральным устареванием. [2]
Жизненный цикл (рис. 1) представляется в виде некоторого числа последовательных фаз, в определенных местах охватываемых обратными связями, когда может возникнуть необходимость повторения какого-либо одного или даже всех этапов разработки системы[6].
Рисунок 1. Жизненный цикл программного обеспечения
Упрощённо место тестирования и отладки в структуре жизненного цикла программного обеспечения можно представить следующим образом[7]:
разработка = анализ + проектирование + программирование
(кодирование) + тестирование + отладка [3]
Один из основных законов тестирования звучит так: «Тестирование программы или ее отдельных модулей не должен осуществлять программист (группа программистов), создавший эту программу или модуль». С целью обеспечения приемлемой степени надежности тестирования необходима работа специального отдела в компании или учреждении, либо аутсорсинг через сторонние организации.
Вначале программист-разработчик устраняет незначительные ошибки самостоятельно. После завершения компиляции модуля, программист обычно запускает откомпилированный фрагмент и производит несколько тестов. После подобного поверхностного тестирования разработчиком данный модуль должен быть протестирован другим программистом. Это обусловлено тем, что программист-разработчик изначально настраивается на определённый вид возможной ошибки и, не обнаружив ее при предварительном тестировании, не проверяет другие участки модуля. Другой же программист рассматривает модуль, подключенный к программе как своеобразный «черный ящик», пытаясь запускать его на предельных нагрузках.
Согласно статистическим данным, около 50% стоимости начальной разработки составляет тестирование[8]. Сколько бы сил, времени и денег не было потрачено на тестирование, один из главных законов программирования действует с неотвратимостью рока: «Тесты могут доказать наличие ошибок в программе, но они не могут доказать их отсутствия» (Э. Дейкстра «Заметки по структурному программированию»). [4]
Существуют различные способы тестирования программ. Тестирование программы как «черного ящика» (стратегия «черного ящика» определяет тестирование с анализом входных данных и результатов работы программы). Критерием исчерпывающего входного тестирования является использование всех возможных наборов входных данных.
Тестирование программы как «белого ящика» заключается в стратегии управления логикой программы, позволяет использовать ее внутреннюю структуру. Критерием выступает исчерпывающее тестирование всех маршрутов и управляющих структур программы. Разумная и реальная стратегия тестирования – сочетание моделей «черного» и «белого ящиков»[9].
Программные ошибки можно разделить на два класса: синтаксические (синтаксис языка программирования) и алгоритмические (логические).
Синтаксические ошибки — возникают из-за нарушения правил языка программирования. Такие ошибки обычно выявляются в процессе компилирования программы компиляции. Могут быть исключены достаточно легко, так как компилятор обычно на стадии трансляции находит ошибки и выдает соответствующие предупреждения. Фактически поиск ошибок осуществляет компилятор, а их исправление — программист.
Семантические (логические) ошибки - те, что приводят к некорректным вычислениям или ошибкам во время выполнения (run-time error). Такие ошибки уже выявляются в разы сложнее: несмотря на корректную работу программы в общем, результаты она выдаёт неверные. Семантические, ошибки устраняют обычно посредством выполнения программы с тщательно подобранными проверочными данными, для которых известен правильный ответ. Для обнаружения ошибок этого класса требуется этап тестирования программы.
При проектировании процедуры тестирования предусматривают серии тестов, которые имеют наивысшую вероятность обнаружения большинства ошибок. Для исчерпывающего тестирования создают эквивалентные разбиения входных параметров, при этом предусматривая 2 класса:
- правильные входные данные;
- неправильные (ошибочные входные значения).
Для каждого класса эквивалентности создаётся свой тест. Класс эквивалентности тестов – множество тестов, в которых выполнение алгоритма на одном из них гарантирует аналогичный результат прогона для других. Так, тестирование заключается в составлении наборов тестов (входные данные – ожидаемый результат), охватывающих все ветки прохождения алгоритма.
Программ без ошибок не существует. Как показывает практика, основные виновники ошибок в программах, как правило, сами программисты. Один из общих законов практического программирования состоит в том, что ни одна программа не дает желаемых результатов при первой попытке трансляции и выполнения[10].
Определённое представление о фактических причинах ошибок в работе программы может дать процентное соотношение источников сбоев (рис. 2).
Рисунок 2. Соотношение источников программных сбоев (в %)
Программист должен не только писать эффективные программы, но и находить в них всевозможные ошибки. В современной практике обучения программированию фокус обычно ставится на выполнении первой части. То есть, всё равно, что обучать летчика только взлету, полагая, что он сам сможет разобраться с посадкой, если все операции взлета будет выполнять в обратном порядке. [4]
В процессе тестирования программ выполняются такие виды деятельности как ручной прогон, проектирование тестов, выполнение тестов и изучение результатов тестирования.
Ручной прогон подразумевает, что программист с помощью карандаша и листа бумаги моделирует прохождение данных через программу. При изучении текста программы от начала до конца, трудно проверить всевозможные комбинации данных. Наиболее осуществимым вариантом является проверка всевозможных типов или наиболее вероятных наборов комбинаций данных. Если они дают правильные результаты, делается допущение, что остальные непроверенные комбинации аналогичным образом дадут правильные результаты.
Наиболее ответственным процессом является проектирование тестов. Поскольку часто тест создается вручную, могут применяться генераторы тестовых данных - специальные программы, формирующие данные в соответствии со спецификациями, задаваемыми программистом. Тестовые данные могут систематически или случайно выбираться из другого заданного набора данных для уменьшения их общего количества. [4]
На этапе выполнения тестов производится проверка всех возможных алгоритмов специально подготовленными тестами, а также выявляется степень устойчивости интерфейса программы к реальным нагрузкам. Осложняется данный этап тем, что тестирование происходит на очень ограниченных объемах данных. Когда база данных будет сотни тысяч записей, скорость выполнения запросов пользователей может стать неприемлемой.
Изучение результатов тестирования. Выявление и устранение ошибок часто имеет циклический характер. Устранение одной ошибки может порождать другие ошибки. Особенно это касается работы с глобальными переменными, которые коварны тем, что нельзя сказать с полной уверенностью, что где-то на нижнем уровне подпрограмм изменение состояния переменной не приведет к новой ошибке. [3]