Файл: Отладка и тестирование программ: основные подходы и ограничения (Основные методы тестирования).pdf
Добавлен: 15.05.2023
Просмотров: 329
Скачиваний: 2
Классы эквивалентности – группа тестов, это класс эквивалентности, если есть условия
1) Все тесты нужны для выявления одинаковой ошибки.
2) Если один из тестов выявит ошибку, остальные тоже выявят её
3) Если один из тестов не выявит ошибки, остальные тоже не выявят её. В результате всех тестов выявляется значение одних и тех же выходных данных. (Cem Kaner, 1999)
Тестирование несложной программы - требуется написать программу, которая считает среднее арифметическое последовательности целых чисел, заканчивающейся нулем.
Пример:
Program p;
Var a, b, c: integer:
Begin
Repeat
Read (a);
B: = b + 1;
C: = c + a
Until a=0;
Writeln(c/b)
End.
По принципу 5 (Искусственное внесение ошибок в программу), перед тем как начать тестировать программу, нужно сформулировать цель тестирования.
Разработка тестов должна быть предназначена для написания программы и должна быть направлена на уяснения задачи. Можно начать с критерия черного ящика.
Первый критерий – тестирование функций в данном случае неинтересен, так как у программы всего одна функция. Эту функцию мы и будем тестировать.
Выделение классов входных и выходных данных в задаче не очевидно. Упорядоченность не важна. Проверка длины последовательности имеет значение. (М.а, 2013)[17]
Поиск классов эквивалентности - Поиск классов эквивалентности, это процесс субъективный. Два человека, анализирующих одну и ту же программу, составят различные классы. Однако постарайтесь все же выявить больше классов эквивалентности: это сэкономит время в дальнейшем и сделает тестирование более эффективным. Вот несколько рекомендаций для поиска классов эквивалентности: (Cem Kaner, 1999)[18]
1) Не забывайте о классах, охватывающих верны и неверные входные данные
2) Организуйте формируемые классы, в виде таблицы
3) Определите диапазоны числовых значений
4) Анализируйте возможные результаты
5) Поищите переменные, значения должны быть равными
6) Найти классы значений, зависящих от времени
7) Выявить группы переменных, результат которых ограничивается набором или диапазоном значений
8) Какие действия программа отвечает эквивалентными событиями
9) Продумать варианты окружения.
Не забывайте о классах, недопустимых входных данных[19] - часто недопустимые входные данные вызывают в программе разнообразные ошибки. Поэтому, чем больше выделите типов неверного ввода, тем больше ошибок будет обнаружено. Существует как минимум 4 вида класса:
1) Допустим ввод чисел от 1 до 99
2) Любое число меньше 1 слишком мало
3) Любое число больше 99 слишком много
4) Если введена нечисловая информация, она не принимается.
Определите диапазоны числовых значений - Обычно среди них имеется три недопустимых класса: все числа, которые меньше граничного значения диапазона, все числа, большие граничного значения, и нечисловые данные. Иногда один из этих классов отсутствует. Например, допускаются числа любой величины. Попробуйте ввести очень большое число и посмотрите, что получится. Посмотрите также, нет ли у значений исследуемого параметра поддиапазон, как у налоговых ставок. Каждый поддиапазон будет отдельным классом эквивалентности.
Переменные, значения которых должны быть равными - Иногда ограничение, налагаемое программой на значения поля, оказывается неожиданным. Значения, которого обычно вполне приемлемы, но в данном месте программой не принимаются, относятся к отдельному классу эквивалентности.
(Cem Kaner, 1999)
Границы классов эквивалентности - для каждого класса эквивалентности можно провести один-два теста. Лучшими будут те, которые проверяют значения, лежащие на границах класса. Они могут быть наибольшими, наименьшими, быстрейшими и, кратчайшими, самыми громкими, но в любом случае это должны быть значения параметров класса. Неправильные операторы сравнения (например,> вместо,> =) вызывают ошибки только на граничных значениях аргументов. В то же время программа, на промежуточных значениях диапазона, почти точно будет работать и на граничных. Нужно протестировать все границы класса эквивалентности, причем с обеих сторон. Программа, которая пройдет эти тесты, скорее всего, пройдет и все остальные.
Вот ряд примеров:
1) Если допустимы значения от 1 до 99, для тестирования допустимых данных можно выбрать 1 и 99, а для тестирования недопустимых — О и 100.
2) Если программа выписывает чеки на суммы от $1 до $99, то нужно попробовать выписать чек на отрицательную сумму, на $0, на $100.
3) Если программа рисует линии длиной от одной точки до 4 сантиметров, попробуйте нарисовать одну точку и линию длиной ровно 4 сантиметра.
4) Если сумма входных значений должна равняться 180, введите значения, дающие в сумме 179, 180 и 181.
5) Когда программа получает определенное количество входных данных, попробуйте ввести в точности необходимое количество, на единицу "меньшее и на единицу большее.
6) Если программа принимает ответы В, С и D, попробуйте ввести А и Е.
7) отправьте на печать файл перед и сразу после того, как принтер напечатает еще задание.
8) После чтения и записи файла на диск проверьте его первый и последний символы.
Анализируя границы диапазонов значений, обязательно учтите все возможные выходные данные. Проанализируйте каждый элемент распечатки или изображения на экране.[20] (Cem Kaner, 1999)
Тестирование переходов между состояниями[21] – если набор предлагаемых изменяется, это означает изменение состояния программы. Самый просто пример - меню. После запуска программы, имеется одна перечень команд. После того как выбрали одну их них состояние программы меняется и в меню появляются команды. Кроме того, на экране меняется информация: форма водных данных, просмотров.
Обязательно нужно протестировать каждую команду в меню. Команда 15 может быть доступная в режиме открываемой по команде 14 и по команде 27.
В этом случае команду 15 нужно будет тестировать дважды. Отбирая тесты для проверки путей выполнения программы, лучше всего следовать по критериями:
1) Тестируйте более вероятные последовательности действий пользователей.
2) Если предположить, что действия пользователя в одном режиме могут воздействовать на представление данных или набор предоставляемых программой в другом режиме, про тестируйте эту зависимость.
3) Кроме проведения самых необходимых тестов — из тех, что описаны выше, — стоит поработать с программой в произвольном режиме, случайным образом выбирая путь ее выполнения.
Переходы между состоянием программы могут быть более сложными, чем просто выбор команд. Содержание и структуры формы ввода данных зависит от информации. Ввод информации может инициировать серию дополнительных вопросов. Тогда вместе с классами эквивалентности их граничными значениями, нужно будет анализировать возможные пути, чтобы составить полноценный набор тестов.
Небольшое количество тестировщиков находит полезным составлять схематическое меню. В этой схеме отражаются состояния программы. В неё включается команды, которые используются через меню.
Нагрузочные испытания – важно протестировать ограничения возможностей программного продукта. Нужно проверить размеры файлов, с которыми работает программа. Откройте максимальное количество файлов и другие данные. Если программа не справится с большим числом, которое пользователь может ввести, нужно составить отчет об ошибке. Если программа спокойно справляется и с очень маленькими и очень большими значениями параметров, возможно, что ограничений нет. (Cem Kaner, 1999)
Нужно проверить, как ведет себя программа, когда нету различных аппаратных ресурсов. Посмотрите, что будет, когда в системе останется мало оперативной памяти. Нагрузите технику, посмотрите, что получится.
Нагрузочное тестирование – это, один из видов тестирования граничных условий. Схема провидения абсолютно аналогично. Сначала программу запускают в тех условиях, в которых она должна работать, а дальше в условиях, для которых, она не предназначена. Имеет смысл проверить комбинации условий. Возможно, что, справившись с повышенными нагрузками по отдельности, она не выдержит их все вместе. Важный момент: нагрузив систему, проведите не просто один-два теста, а достаточно длительное и тщательно тестирование. Поэксплуатируйте программу в таких условиях некоторое время, возможно, сбой не сразу, но все же произойдет.
Применение технологии эквивалентности – тестирование функций, это не единственная область применения эталонных программ. Можно тестировать самые разные аспекты программы, вот примеры:
1) Если разрабатывается программа проверки правописания, то в ее основе лежит алгоритм, который используется в одной уже существующих программ, можно предложить им проверить один и тот же набор слов.
2) Если разрабатывается программа автоматического переноса слов и особенно если отрабатывается модификация алгоритма для другого языка, для сверки возьмите проверенную программу. Подготовьте узкий столбик текста и предложите его обеим программам.
3) Для программы, выполняющей выравнивание текста по ширине строки, необходимо проверить, насколько равномерно она разделяет слова пробелами. Можно взять обычный текстовый процессор и обеим программам предложить один и тот же текст, с одинаковыми шрифтами.
4) Для отладки последовательностей на принтере можно перенаправить вывод в файл и то же самое сделать в эталонной программе, распечатав в ней точно такой же документ. Затем оба файла можно сравнить — они должны быть одинаковы.
Обязательно включайте в отчеты об ошибках выходные данные, полученные от обеих программ. Они очень важны для поиска причины ошибки.[22] (Cem Kaner, 1999)
Вывод: Я считаю, цель тестирования программного обеспечения – найти ошибки в написании программы и их устранения. Проводить тест должны люди, которые не участвовали в процессе её написания.
2 Тестирование программного обеспечения
Тестирование “Черного ящика”
Когда составление завершено, программа передается составу тестирования. они находят ошибки, составляют о них отчеты. Потом они находят старые ошибки, которые не были выявлены в первый раз, и новые, появившиеся после доработки.
Мартин и Мак-Клер (Martin & mcClure, 1983) подытожили собранные Боэмом (Boehm) данные об эффективности исправления найденных ошибок.
• Если для исправления ошибки нужно изменить не более десяти операторов, вероятность того, что это будет сделано правильно с первого раза, составляет 50%.
• Если для исправления ошибки нужно изменить около пятидесяти операторов, вероятность того, что это будет сделано правильно с первого раза, составляет 20%.[23]
Устранение одной из ошибок может привести к появлению другой. Бывает так, что одна ошибка скрывает другую, которая проявляется только после ее устранения. Программисты часто думают только о поставленной перед ними проблеме и, решив ее, считают свою работу сделанной.
Программиста нужно быть готовым тестировать одну и ту же программу очень большое количество раз. На ранних стадиях тестов, исправленные версии программы могут поступать каждые несколько часов. Поэтому есть одно правило не использовать новую версию, пока не будет самым тщательным образом протестирована старая версия. Полное тестирование очередной версии с составлением полного отчета обо всех известных проблемах и всех найденных в этой версии ошибках называют полным циклом. (Cem Kaner, 1999)
тест для программы будет в любом случае неполным. Главной целью стратегии проектирования является уменьшение этой «неполноты» тестирования, насколько это возможно.[24] (И.В, 2006)
тестирования функций[25]- требуют набор тестов, чтобы был выполнен хотя бы один тест для любой из функций, использованной программой. (М.а, 2013)
Тестирования классов входных данных[26]-это тестирование требует группировать входные данные, разделить их на группы, так чтобы все данные из одной группы, были равны с точки зрения проверки программы
тестирования классов выходных данных – требует все тоже самое, что и входные данные, только выходные, часто эти три критерия хорошо взаимодействуют друг с другом. (М.а, 2013)