Тестирование черного ящика. Б. Бейзер (2004) (1186170), страница 32
Текст из файла (страница 32)
Как бы то ии было, хотя большая часть поведенческого тестировав и я является звристичсским и в его ос~ юве лежат факты, полученные опытным путем, полобиос тестирование должпо в максимальной степени соответствовать и быть <лспоааииым иа более фунламеитальиых, основополагающих структурных методах. 134 Глава 5 ° Тестирование потоков данных Методы тестирования потоков данных более эффективны, чем методы тестирования потоков управления.
Более эффективны в том смысле, что они могут обнаружить больше ошибок. Они также более эффективны с точки зрения теории, поскольку модель помогает нам создать все тесты, которые мы могли бы создать с помощью тестирования потоков управления и еще некоторые дополнительные тесты, Однако за это приходится расплачиваться, Чтобы достичь более эффективного тестирования, вам приходится проделать больше работы. Больше работы, во-первых, при проектировании тестов, а, во-вторых, при проверке результатов тестирования.
Приведенные ниже методы тестирования, используемые в графах потоков данных, расположены по степени возрастания их эффективности. Покрытие ввода/вывода. Рассмотрим каждый выходной узел отдельно (помните, что граф потока данных имеет по одному выходному узлу на каждый вывод). Для каждого выходного узла используйте набор входных значений, которые приводят к определенному значению вывода. В этой технике есть очевидное слабое место. Мы обеспечим покрытие входных и выходных узлов и, возможно, некоторых промежуточных узлов, но если среди них имеется отдельнгяй предикат вьп бора, мы можем быть уверены в том, что используется только одно значение этого предиката. Другие не будут протестированы.
Эта проверка слишком слаба, чтобы быть нам полезной. Она гарантирует нам только то, по программное обеспечение работает для одного набора входных данных и, очевидно, не делает ничего плохого — например, сбоя. Забудьте об этом методе.
Ввод/вывод + осе предикаты, Давайте попробуем нечто посильнее. Усилим покрытие ввода/вывода, следя за тем, чтобы все предикаты (включая предикаты потока управления для циклов н другого необходимого упорядочения) были проверены для обоих значений истинности и аналогично для предикатов в операторах СА5Е. Это уже лучше, но все же недостаточно хорошо. Что, если есть промежуточные вычисления, результаты которых не используются? Мы не сможем их обнаружить, нс так ли? В качестве другой возможности рассмотрим следующий вариант.
Мы рассчитгяваем величину Х, но не используем ее, поскольку где-то позже на этом пути мы пересчитываем величину Х без использования первого значения. В этом случае селекторы отсутствуют. Вычисление чего-либо без последующего использования полученного результата — это, скорее всего, ошибка, которая чаще всего является лишь неоправданной тратой ресурсов, но иногда может быть опасна. Тут стоит взглянуть на дело со стороны.
Наша модель основана на том, что, как мы надеемся, является корректной реализацией исходных требований. Но мы же тестируем реализацию, содержащую ошибки. Следовательно, промежуточное вычисление, выход которого не используется, по всей видимости, является ошибкой, н мы должны стараться ее обнаружить. Процитируем Раппса и Веюкера [КЛРР82): «Нельзя быть уверенным в программе, если нельзя увидеть эффект от использования величины, полученной...
в ходе каждого вычисления, . Если мы просто проверили все узлы с предикатами (как потока управления, так и выбора данных), мы добились большего, чем тестирование ветвей потока управления (из-за проблемы составных предикатов), но мы не получили бы всех тех преимуществ, которые дает тестирование потоков данных.
5.4. Методы 13$ Частичное покрытие узлов. Предыдущие методы обеспечивали покрытие некоторых узлов и некоторых связей, но при этом не гарантировали, что будет обеспечено покрытие всех узлов и/или всех связей. Таким образом, зная, что цель нашей стратегии, по крайней мере, обеспечить покрытие вычислительных узлов нашей модели, давайте удостоверимся, что так оно и есть на самом деле. Это называется стратегией всех определений, поскольку каждый вычислительньш узел в нашей модели потока данных соответствует определению некоторой переменной.
Заметьте, что это не обеспечивает покрытия связей. Таким образом, эту стратегию нельзя прямо сравнивать со стратегией ввод/вывод е предикат, описанной ранее. Что эта стратегия значит? Мы создаем и выполняем достаточно тестов, чтобы быть уверенными в проверке каждого вычислительного узла нашей модели. Это означает, что каждая функция была выполнена хотя бы один раз и лала (по крайней мере, мы надеемся на это) правильное значение для этого случая.
Заметьте, что мы отвечаем за проверку промежуточных результатов, поскольку тестирование каждого вычислительного узла подразумевает проверку вычисления, сделанного в атом узле. Стратегия все определения (ВО) представляет определенный интерес, поскольку в ранней литературе, посвященной эвристическому тестированию потоков данных, обычно предлагался этот метод ]ВЕХР70, ВЕХР85, НЕКМ76]. Здесь наши методы основаны на формальной, проверенной теории ]ГКАХ88, КАРР82]. ВО также упускает слишком многое. Например, этот метод может пропустить все узлы выбора и все циклы в модели. Этого достаточно, чтобы отказаться от такого метода.
Нам нужно что-то более сильное. Все узлы. Следующая очевидная ступень — убедиться, что мы покрываем все узлы, а не только вычислительные. Это, несомненно, более сильное утверждение, потому что мы хотим быть уверены, что в дополнение к вычислительным узлам мы обеспечиваем покрытие всех узлов выбора данных и узлов потока управления. Но это нелостаточно сильно, поскольку, например, не дает гарантии, что мы проверили все варианты для предикатов выбора и потока управления.
Требуется нечто еще более сильное. Покрытие связей (все использования). Следующая логическая ступень — охват всех связей в графе потока данных, Она соответствует стратегии всех использований. Всякий раз, когда вычисление выполнено, мы будем проверять каждое использование результата этого вычисления в последующей обработке. Это, конечно, подразумевает проверку всех промежуточных вычислений, а не только конечных выводов.
Но это не означает тестирования каждого возможного пути в программе. Это даже не тестирование всех возможных путей между точкой определения и местом его последующего использования. Все использования + циклы. Существует много не охваченных здесь других стратегий тестирования потоков данных. Для того чтобы получить общее представление о них, смотрите ]'1~г'ЕУП94А] в ]МАКС94]. Нам следует попытаться не допускать циклов в наших моделях потока данных, но это не всегда возможно. Если у вас есть подобные циклы, тогда разверните модель и добавьте к вашим тестовым вариантам покрытие связей развернутой модели'.
136 Глава 5 ° Тестирование потоков данных 5.4.3. Построение модели Настало время прекратить теоретизирование и начать построение модели. Давайте разработаем упрощенный вариант для строк с 54 по 60 формы 1040. Вот исход- ный материал, скопированный из документа ВНС с минимальными изменениями, введенными для ясности. 54: Ребега1 Тах Извпле1б (Удержанный федеральный налог) 55: 1994 евсзшасеб Тах Раушепг (Выплага налога со всех видов дохода в 1994) апб Лщоцпт Арр1!еб Ггсяп 1993 йесцгп (Сумна.
заявленная в декларации 1993) 56: Еагпеб !псоше Сгеюв (Налоговые льготы. предосгавпяеные получагелян заработной платы) 57: дпюцпв Ра!б югц Ропп 4868 (Ехтепв!оп йеццезв) (Сумма. уплаченная в соответствии с формой 4686 (Просьба о продлении)) 58а: Ехсевз 5ос!а1 5есцгзву апб ййТА Тах Изслпе!б (Налог на превышение социального обеспечения) 59: Другие выплаты в соответствии с формой 2439 или формой 4136 60. Общий платеж: сумма строк с 54 по 59. На самом деле это неправильно, не так ли? Строка 55 по сути является суммой двух слагаемых, строка 58а — сумма двух слагаемых, и строка 59 тоже является суммой двух слагаемых (форма 2349 и форма 4136; Налог со всех видов дохода в 1994 и Сумма, взятая из декларации 1993, соответственно).
Мы создадим более детальную модель. Ребега1 тах и!ьпье1б (удержанный федеральный налог) 1994 Евв!шагеб Тал Рауяепв (Выплага налога со всех видов дохода в 1994] Апоцпт Арр1!еб ?гош 1993 йесцгп 54. 60. 55а: 55. 55Ь. 55. ' Нвм нужна одна нз стрвтегий «всех нспользоввнийь, но не нестолько мощная, квк проверка всех путей, которая в коггтексге повеленческога тесгироваггня просто ггеосугнествнме Первое приближение нашей модели почти полностью совпадает со строками налоговой декларации и лишь имеет слегка более формальный вид.
В глубине души я надеюсь использовать инструмент, который поможет мне проверить полноту и непротиворечивость этой спецификации, так что заблаговременная формализация — хорошая идея. 54. 60; Ребега1 Тах Изсппе)б (Удержанный федеральный налог) 55: 60: 1994 Евв(шасеб Тах Раушепс (Выплага налога со всех видов дохода в 1994) апб Ашоцпв Ярр1зеб тгош 1993 йесцгп (Сунна заявленная в декларации 1993 ) 56.
60: Еагпеб !псопе Сгеб!г. (Налоговые льготы предосгавляемые получагепям заработной плагы) 57: 60: Ашоцпд Разб ю СП Ропп 4868 (Ехвепю оп йеццевс) (Сумма уплаченная в соогвегсгвии с формой 4868 (Просьба о продлении)) 58а: 60 Ехсевв 5осза1 5есцгзву апб ййТА Тах И!Сппе1б (Налог на превишение социального обеспечения> 59: 60- другие выппагы (в соогвегствии с формой 2439 ипи формой 4136) 60: Общий Плагеж: сумма строк с 54 по 59. 5.4.
Методы 137 (Сунна заявленная в декпарации 1993 ) 55; 60: 55а + 55Ь 56; 60: Еагпец !псопе Сгебтт (Напоговые пьготы предоставпяемые попучатепям заработной платы) 57: 60; Ашоцпв Ратб и!ЬЬ Еогш 4868 (Ехтепзтоп дедцезв) (Сумма уплаченная в соответствии с формой 4868 (Просьба о продлении)) 58а): 58а: Ехсезз 5оста1 5есцгтту Тах Нтвббе1О (напог на превышение социапьного обеспечения) 58а2: 58а. Ехсезз ПТТА Тах Иттдйе10 (Напог на превышение ддТА) 58а: 60 58а) + 58а2 59а: 59 Другие выппаты в соответствии с Формой 2439 59Ь: 59; Другие выплаты в воответствии с ФормОй 4136 59: 60: 59а ь 59Ь 60: Тота1 Раушепвз (Общие выплаты):= 54 ь 55 + 56 + 57ь 58а + 59 Последняя строка мне не нравится из-за ее двусмысленного представления.
Речь шла об узлах 54, 55 и так далее, или об их значениях? Будет лучше внести ясность и заменить зту строку такой: 60: Тота1 Раушептз: С54 + С55 + С56 + С57 + С58а ь С59 В атой модели я сделал некоторые предположения, которые могут бъпь, а могут и не быть верными. Во всех случаях, когда я детализировал узел (55, 58а и 59), я предполагал, что входные данные могут прийти из ниоткуда, из одного или всех доступных источников. Эти узлы не являются узлами выбора данных. Узлы выбора должны иметь дело с взаимоисключающими случаями. Например, строка 38 — зто узел выбора, так как в нем делается выбор между взаимоисключающими случаями.