Реферат: Программа сложной структуры с использованием меню
проверки обоих вариантов выхода из цикла : NOT x и NOT y ).
С другой стороны покрытие условий может не обеспечивать покрытия всех
переходов. Например, конструкция IF A AND BTHEN... требует по критерию покрытия
условий двух тестов (например, A=true, B=false и A=false, B=true ), при
которыхможет не выполняться оператор, расположенный в then - ветви оператора
if.
Практически единственным средством, предоставляемым современными системами
программирования, является возможность определения частоты выполнения
различныхоператоров программы (ее профилизации). Но с помощью этого инструмента
поддержки тестирования можно проверить выполнение только слабейшего из
критериевполноты - покрытие всех операторов.
Правда, с помощью этого же инструмента можно проверить и выполнение критерия С1.
Но дляэтого предварительно текст программы должен быть преобразован таким
образом, чтобы все конструкции условного выбора (IF и CASE
10
или SWITCH ) содержали ветви ELSE или DEFAULT, хотя бы и пустые. В этом случае
всеветви алгоритма , не выполнявшиеся на данном тесте будут “видимы” из таблицы
частоты выполнения операторов преобразованной программы.
Актуальной остается задача создания инструментальных средств, позволяющих :
1) накапливать информации о покрытых и непокрытых ветвях для
всех использованных тестов ;
2) выделять разработчику еще не покрытые при тестировании
участки программы, облегчая выбор следующих тестов;
3) поддерживать более мощные критерии полноты структурного
тестирования.
Совместное тестирование модулей.
Известны два подхода к совместному тестированию модулей : пошаговое и монолитное
тестирование.
При монолитном тестировании сначала по отдельности тестируются все модули
программногокомплекса, а затем все они объединяются в рабочую программу для
комплексного тестирования.
При пошаговом тестировании каждый модуль для своего тестирования подключается к
набору ужепроверенных модулей.
В первом случае для автономного тестирования каждого модуля требуется модуль -
драйвер ( то естьвспомогательный модуль, имитирующий вызов тестируемого модуля)
и один или несколько модулей - заглушек ( то есть вспомогательных модулей,
имитирующихработу модулей, вызываемых из тестируемого). При пошаговом
тестировании модули проверяются не изолированно друг от друга, поэтому требуются
либо толькодрайверы, либо только заглушки.
А
BC D
E F
рис. 1
12
При сравнении пошагового и монолитного тестирования можно отметить следующие
преимущества первогоподхода :
1) меньшая трудоемкость (для примера на рис.1 при монолитном
тестировании требуются 5 драйверов и 5 заглушек; при пошаговом тестировании
требуются или только 5 драйверов - если модули подключаются “снизу вверх ”, -
или только 5 заглушек - если модули подключаются“сверху вниз”) ;
2) более раннее обнаружение ошибок в интерфейсах между
модулями (их сборка начинается раньше,чем при монолитном тестировании ) ;
3) легче отладка, то есть локализация ошибок (они в основном
связаны с последним из подключенных модулей) ;
4) более совершенны результаты тестирования (более
тщательная проверка совместного использованиямодулей).
Есть приемущества и у монолитного тестирования :
1) меньше расход машинного времени (хотя из-за большей
сложности отладки может потребоватьсядополнительная проверка программы и это
приемущество будет сведено на нет) ;
2) предоставляется больше возможностей для организации
параллельной работы на начальном этапетестирования.
В целом более целесообразным является выбор пошагового тестирования. При его
использованиивозможны две стратегии подключения модулей : нисходящая и
восходящая.
Нисходящее тестирование начинается с главного (или верхнего) модуля программы, а
выбор следующегоподключаемого модуля происходит из числа модулей, вызываемых из
уже протестированных. Одна из основных проблем , возникающих при
нисходящемтестировании, - создание заглушек. Это тривиальная задача, т. к. как
правило недостаточно, чтобы в заглушке выполнялся вывод
соответствующегоинформационного сообщенияи и возврат всегда одних и тех же
значений выходных данных.
Другая прблема , которую необходимо решать при нисходящем тестировании, - форма
представления тестов впрограмме, так как, как правило, главный модуль получает
входные данные не непосредственно, а через специальные модули ввода, которые при
тестировании вначале заменяются заглушками. Для передачи в главный модуль разных
тестов нужно или иметь несколько разных заглушек, или записать эти тесты в файл
во внешнейпамяти и с помощью заглушки считывать их.
Поскольку после тестирования главного модуля процесс проверки может продолжаться
по-разному,следует придерживаться следующих правил :
а) модули, содержащие операции ввода-вывода, должны подключаться к
тестированию как можно раньше ;
б) критические (т.е. наиболее важные ) для программы в
целом модули также должны тестироваться впервую очередь.
12
Основные достоинства нисходящего тестирования :
уже на ранней стадии тестирования есть возможность получить
работающий вариант разрабатываемойпрограммы ;
быстро могут быть выявлены ошибки, связанные с организацией
взаимодействие с пользователем.
Недостатки нисходящей стратегии продемонстрируются с помощью рис.2.
Допустим , что на следующем шаге тестирования заглушка модуля H заменяется его
реальным текстом.Тогда
1) может оказаться трудным или даже невозможным
построить такой тест на входе модуля J, которыйсоотвеьствовал бы любой заданной
наперед последовательности значений данных на входе модуля Н ;
2) не всегда окажется возможным легко оценить
соответствие значений данных на входе модуля Jтребуемым тестам для проверки
модуля Н;
3) т. к. результаты выполнения прграммы на построенном
для проверки модуля Н тесте выводятся не им,а модулем I , может оказаться
трудным восстановлении дейсвительных результатов работы модуля Н.
Другие проблемы, которые могут возникать при нисходящем тестировании :
появляется соблазн совмещения нисходящего
проектирования с тестированием, что, как правило,неразумно, т.к. проектирование
- процесс итеративный и в нем неизбежен возврат на верхние уровни и исправление
принятых ранее решений, что обесцениваетрезультаты уже проведенного тестирования
;
может возникнуть желание перейти к тестированию модуля
следующего уровня до завершениятестирования предыдущего по объективным причинам
(необходимости создания нескольких версий заглушек, использования модулями
верхнего уровня ресурсовмодулей нижних уровней).
При восходящем тестировании прверка программы начмнается с терминальных модулей
(т.е. тех,которые не вызывают не каких других модулей программы). Эта стратегия
во многом противоположна нисходящему тестированию (в частности, преимущества
становятсянедостатками и наоборот).
Нет проблемы выбора следующего подключаемого модуля - учитывается лишь то ,
чтобы он вызывал толькоуже протестированые модули. В отличие от заглушек
драйверы не должны иметь несколько версий, поэтому их разработка в большенстве
случаев проще (крометого, использование средств автоматизации и отладки
облегчает создание как раз драйверов, а не заглушек).
Другие достоинства восходящего тестирования :
поскольку нет промежуточных модулей (тестируемый модуль
является для рабочего вариантапрограммы модулем самого верхнего уровня), нет
проблем, связанных с возможностью или тружностью задания тестов ;
нет возможности совмещения проектирования с
тестированием ;
нет трудностей, вызывающих желание перейти к
тестированию следующего модуля , не завершивпроверки предыдущего.
Основными недостатком восходящего тестирования является то , что проверка всей
структурыразрабатываемого программного комплекса возможна только на завершающей
стадии тестирования.
Хотя однозначного вывода о преимущества той или иной стратегии пошаговаого
тестирования сделать нельзя(нужно учитывать конкретные характеристики
тестируемой программы), в большинстве случаев более предпочтительным является
восходящеетестирование.
На третьем этапе тестирования программных комплексов (тестировании функций)
ипользуются преждевсего методы функционального тестирования.
Функциональное тестирование.
Обзор методов проектирования тестов при функциональеом тестировании начнем с
методазквивалентного разбиения.
Т.к. нашей целью является построения множества тестов, характеризующегося
наивысшейвероятностью обнаружения большинстыва ошибок в тестируемой программе,
то тест из этого множества должен :
1) уменьшать (более чем на единицу) число других тестов, которые должны быть
разработанны для достижения заранее поставленной цели
“удовлетворительного”тестирования ;
2) покрывать собой значительную часть других возможных
тестов .
Другими словами :
1) каждый тест должен заключать в себе проверку