Калайда В.Т., Романенко В.В. Технология разработки программного обеспечения (1015641), страница 13
Текст из файла (страница 13)
Большинство руководителей проектов называюттестовый прогон неудачным, если обнаружена ошибка, и, наоборот, удачным, если он прошел без ошибок. Чаще всего этоявляется следствием ошибочного понимания термина «тестирование», так как, по существу, слово «удачный» означает «результативный», а слово «неудачный» — «нежелательный», «нерезультативный». Но если тест не обнаружил ошибки, его выполнение связано с потерей времени и денег, и термин «удачный» никак не может быть применен к нему.87Тестовый прогон, приведший к обнаружению ошибки, нельзя назвать неудачным хотя бы потому, что, как отмечалосьвыше, это целесообразное вложение капитала. Отсюда следует,что в слова «удачный» и «неудачный» необходимо вкладыватьсмысл, обратный общепринятому.
Поэтому в дальнейшем будем называть тестовый прогон удачным, если в процессе еговыполнения обнаружена ошибка, и «неудачным», если — корректный результат.Проведем аналогию с посещением больным врача. Еслирекомендованное врачом лабораторное исследование не обнаружило причины болезни, не назовем же мы такое исследование удачным — оно неудачно: ведь деньги пациент заплатил, аон все так же болен. Если же исследование показало, что убольного язва желудка, то оно является удачным, посколькуврач может прописать необходимый курс лечения. Следовательно, медики используют эти термины в нужном нам смысле(аналогия здесь, конечно, заключается в том, что программа,которую предстоит тестировать, подобна больному пациенту).Определения типа «тестирование представляет собой процесс демонстрации отсутствия ошибок» порождают еще однупроблему: они ставят цель, которая не может быть достигнутани для одной программы, даже весьма тривиальной.
Результатыпсихологических исследований показывают, что если перед человеком ставится невыполнимая задача, то он работает хуже.Иными словами, определение тестирования как процесса обнаружения ошибок переводит его в разряд решаемых задач и, таким образом, преодолевается психологическая трудность.Другая проблема возникает в том случае, когда для тестирования используется следующее определение:«Тестирование — это процесс, позволяющий убедиться втом, что программа выполняет свое назначение», поскольку программа, удовлетворяющая данному определению, может содержать ошибки. Если программа не делает того, что от нее требуется, то ясно, что она содержит ошибки. Однако ошибки могутбыть и тогда, когда она делает, и что от нее не требуется.Подводя итог, можно сказать, что тестирование представляется деструктивным процессом попыток обнаружения ошибок в программе (наличие которых предполагается).
Набор тестов, способствующий обнаружению ошибки, считается удач-88ным. Естественно, в конечном счете, каждый с помощью тестирования хочет добиться определенной степени уверенности втом, что его программа соответствует своему назначению и неделает того, для чего она не предназначена, но лучшим средством для достижения этой цели является непосредственныйпоиск ошибок.
Допустим, кто-то обращается к вам с заявлением: «Моя программа великолепна» (т.е. не содержит ошибок).Лучший способ доказать справедливость подобного утверждения — попытаться его опровергнуть, обнаружить неточности,нежели просто согласиться с тем, что программа на определенном наборе входных данных работает корректно.6.2 Экономика тестированияДав такое определение тестированию, необходимо на следующем шаге рассмотреть возможность создания теста, обнаруживающего все ошибки программы.
Покажем, что ответ будетотрицательным даже для самых тривиальных программ. В общем случае, невозможно обнаружить все ошибки программы. Аэто, в свою очередь, порождает экономические проблемы, задачи, связанные с функциями человека в процессе отладки, способы построения тестов.6.2.1 Тестирование программы как черного ящикаОдним из способов изучения поставленного вопроса является исследование стратегии тестирования, называемой стратегией черного ящика, тестированием с управлением по данным или тестированием с управлением по входу-выходу. Прииспользовании этой стратегии программа рассматривается какчерный ящик. Иными словами, такое тестирование имеет цельювыяснение обстоятельств, в которых поведение программы несоответствует ее спецификации.При таком подходе обнаружение всех ошибок в программе является критерием исчерпывающего входного тестирования. Последнее может быть достигнуто, если в качестве тестовых наборов использовать все возможные наборы входных данных.
Поэтому для тестирования даже небольшой программытребуется бесконечное число тестов. Как пример можно приве-89сти задачу о треугольниках. Даны три числа — A, B и C. Требуется определить, могут ли эти числа являться длинами сторонтреугольника, и если да, то является ли этот треугольник прямоугольным, равнобедренным или равносторонним.
Очевидно,что если A, B и C являются вещественными числами, то имеется бесконечное количество комбинаций их значений.Если такое испытание представляется сложным, то ещесложнее создать исчерпывающий тест для большой программы.Образно говоря, число тестов можно оценить «числом,большим, чем бесконечность».Из изложенного следует, что построение исчерпывающего входного теста невозможно. Это подтверждается двумя аргументами: во-первых, нельзя создать тест, гарантирующий отсутствие ошибок; во-вторых, разработка таких тестов противоречит экономическим требованиям.
Поскольку исчерпывающеетестирование исключается, нашей целью должна стать максимизация результативности капиталовложений в тестирование(иными словами, максимизация числа ошибок, обнаруживаемых одним тестом). Для этого мы можем рассматривать внутреннюю структуру программы и делать некоторые разумные,но, конечно, не обладающие полной гарантией достоверностипредположения.6.2.2 Тестирование программы как белого ящикаСтратегия белого ящика, или стратегия тестирования,управляемого логикой программы, позволяет исследовать внутреннюю структуру программы. В этом случае тестирующийполучает тестовые данные путем анализа логики программы (ксожалению, здесь часто не используется спецификация программы).Сравним способ построения тестов при данной стратегиис исчерпывающим входным тестированием стратегии черногоящика.
Непосвященному может показаться, что достаточно построить такой набор тестов, в котором каждый оператор исполняется хотя бы один раз; нетрудно показать, что это неверно.Не вдаваясь в детали, укажем лишь, что исчерпывающему входному тестированию может быть поставлено в соответствие ис-90черпывающее тестирование маршрутов. Подразумевается, чтопрограмма проверена полностью, если с помощью тестов удается осуществить выполнение этой программы по всем возможным маршрутам ее потока (графа) передач управления.Последнее утверждение имеет два слабых пункта.
Одиниз них состоит в том, что число не повторяющих друг другамаршрутов в программе — астрономическое. Чтобы убедитьсяв этом, рассмотрим представленный на рис. 6.1 граф передачуправления простейшей программы. Каждая вершина или кружок обозначают участок программы, содержащий последовательность линейных операторов, которая может заканчиватьсяоператором ветвления. Дуги, оканчивающиеся стрелками, соответствуют передачам управления. По-видимому, граф описывает программу из 10–20 операторов, включая цикл DO, которыйисполняется не менее 20 раз. Внутри цикла имеется несколькооператоров IF. Для того, чтобы определять число неповторяющихся маршрутов при исполнении программы, подсчитаем число неповторяющихся маршрутов из точки A в B в предположении, что все приказы взаимно независимы.
Это число вычисляется как сумма 520 + 519 + … + 51 = 100 триллионов, где5— число путей внутри цикла. Приведем такой пример: если допустить, что на составление каждого теста мы тратим пять минут, то для построения набора тестов нам потребуется примерно один миллиард лет.91A≤ 20разBРис. 6.1 — Граф передач управления небольшой программыВторой слабый пункт утверждения заключается в том,что, хотя исчерпывающее тестирование маршрутов являетсяполным тестом и хотя каждый маршрут программы может бытьпроверен, сама программа может содержать ошибки. Это объясняется следующим образом.