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