Тестирование программных средств Тема 11 Тестирование – процесс выполнения программы с намерением найти ошибки Цель проверяющего (тестовика) — заставить программу сбиться. Роль тестирования состоит в том, чтобы определить местонахождение немногочисленных ошибок, оставшихся в хорошо спроектированной программе. Основные определения Тестирование (testing) — процесс выполнения программы (или части программы) с целью найти ошибки. Доказательство (proof) — попытка найти ошибки в программе безотносительно к внешней для программы среде. Большинство методов доказательства предполагает формулировку утверждений о поведении программы и затем вывод и доказательство математических теорем о правильности программы. Доказательства могут рассматриваться как форма тестирования, хотя они и не предполагают прямого выполнения программы. Контроль (verification) — попытка найти ошибки, выполняя программу в тестовой, или моделируемой, среде. Испытание (validation) — попытка найти ошибки, выполняя программу в заданной реальной среде. Аттестация (certification) — авторитетное подтверждение правильности программы. При тестировании с целью аттестации выполняется сравнение с некоторым заранее определенным стандартом. Отладка (debugging) - не является разновидностью тестирования. Хотя слова «отладка» и «тестирование» часто используются как синонимы, под ними подразумеваются разные виды деятельности. Тестирование — деятельность, направленная на обнаружение ошибок; отладка направлена на установление точной природы известной ошибки, а затем — на исправление этой ошибки. Эти два вида деятельности связаны — результаты тестирования являются исходными данными для отладки. Основные определения Тестирование модуля, или автономное тестирование (module testing, unit testing) — контроль отдельного программного модуля, обычно в изолированной среде (т. е. изолированно от всех остальных модулей). Тестирование модуля иногда включает так же математическое доказательство. Тестирование сопряжений (integration testing) — контроль сопряжений между частями системы (модулями, компонентами, подсистемами). Тестирование внешних функций (external function testing) — контроль внешнего поведения системы, определенного внешними спецификациями. Основные определения Комплексное тестирование (system testing) — контроль и/или испытание системы по отношению к исходным целям. Комплексное тестирование является процессом контроля, если оно выполняется в моделируемой среде, и процессом испытания, если выполняется в среде реальной, жизненной. Тестирование приемлемости (acceptance testing) — проверка соответствия программы требованиям пользователя. Тестирование настройки (installation testing) — проверка соответствия каждого конкретного варианта установки системы с целью выявить любые ошибки, возникшие в процессе настройки системы. Экономика тестирования Тестирование программы как «черного ящика» ВХОД Тестируется входная информация ВЫХОД Тестируется выходная информация Сложности создания исчерпывающего теста: 1) нельзя создать тест, гарантирующий отсутствие ошибок; 2) разработка таких тестов противоречит экономическим требованиям. Тестирование программы как «белого ящика» ВХОД Тестируется внутреннее содержание программы ВЫХОД Сложности проведения исчерпывающего тестирования маршрутов: 1) Число не повторяющих друг друга маршрутов в программе - астрономическое. 2) Хотя исчерпывающее тестирование маршрутов является полным тестом, и хотя каждый маршрут программы может быть проверен, сама программа будет содержать ошибки. Тестирование программы как «белого ящика» Причины ошибок: 1) Исчерпывающее тестирование маршрутов не может дать гарантии того, что программа соответствует описанию. 2) Программа может быть неверной в силу того, что пропущены некоторые маршруты. 3) Исчерпывающее тестирование маршрутов не может обнаружить ошибок, появление которых зависит от обрабатываемых данных. Аксиомы (принципы) тестирования 1) Хорош тот тест, для которого высока вероятность обнаружить ошибку. 2) Одна из самых сложных проблем при тестировании - решить, когда нужно его закончить. 3) Не нужно тестировать свою собственную программу. 4) Необходимая часть всякого теста - описание ожидаемых выходных данных (результатов). 5) Избегайте невоспроизводимых тестов, не тестируйте «с лету». Аксиомы тестирования 6) Готовьте тесты как для правильных, так и для неправильных входных данных. 7) Детально изучите результаты каждого теста. 8) Если число ошибок растет, то растет вероятность обнаружения ошибок. Аксиомы тестирования 9) Поручайте тестирование самым способным программистам. 10) Проект системы должен быть таким, чтобы каждый модуль подключался к системе только один раз. 11) Никогда не изменяйте программу, чтобы облегчить ее тестирование. 12) Тестирование, как и всякая другая деятельность, должна начинаться с постановки целей. Философия тестирования Чтобы ориентироваться в стратегиях проектирования тестов, рассматривают два крайних подхода, находящихся на границах спектра. Тестирование модулей Причины тестирования модулей: 1) Появляется возможность управлять комбинаторикой тестирования, поскольку первоначально внимание концентрируется на небольших модулях программы. 2) Облегчается задача отладки программы, т.е. обнаружение места ошибки и исправление текста программы. 3) Допускается параллелизм, что позволяет одновременно тестировать несколько модулей. Цель тестирования модулей — сравнение функций, реализуемых модулем, со спецификациями его функций или интерфейса. Пошаговое тестирование Подходы к комбинированию модулей 1) Пошаговый метод тестирования или сборки. 2) Монолитный метод («большого удара») при тестировании и сборке программы. 1 2 3 Восходящее тестирование 4 3 2 1 Процесс повторяется до тех пор, пока не будет достигнута вершина. Нисходящее тестирование 1 2 3 4 Процесс повторяется до тех пор, пока не будут собраны и проверены все модули. Нисходящее тестирование Достоинства: 1) метод совмещает тестирование модуля, тестирование сопряжений и частично тестирование внешних функций. 2) когда модули ввода-вывода уже подключены, тесты можно готовить в удобном виде 3) выгоден, когда есть сомнения относительно осуществимости программы в целом или когда в проекте программы могут оказаться серьезные дефекты. 4) отсутствие необходимости в драйверах; вместо драйверов вам просто следует написать «заглушки». Нисходящее тестирование Недостатки: 1)модуль редко тестируется досконально сразу после его подключения. 2) он может породить веру в возможность начать программирование и тестирование верхнего уровня программы до того, как вся программа будет полностью спроектирована. Метод «большого скачка» В соответствии с этим методом каждый модуль тестируется автономно. По окончании тестирования модулей они интегрируются в систему все сразу. Заглушки и драйверы необходимы для каждого модуля. Модули не интегрируются до самого последнего момента, а это означает, что в течение долгого времени серьезные ошибки в сопряжениях могут остаться необнаруженными. Метод сандвича Тестирование методом сандвича представляет собой компромисс между восходящим и нисходящим подходами. При использовании этого метода одновременно начинают восходящее и нисходящее тестирование, собирая программу как снизу, так и сверху и встречаясь в конце концов где-то в середине. Метод сандвича 1 2 3 2 1 Метод сандвича сохраняет такое достоинство нисходящего и восходящего подходов, как начало интеграции системы на самом раннем этапе. Модифицированный метод сандвича В модифицированном методе сандвича нижние уровни также тестируются строго снизу вверх. Модули верхних уровней сначала тестируются изолированно, а затем собираются нисходящим методом. Таким образом, модифицированный метод сандвича также представляет собой компромисс между восходящим и нисходящим подходами.