Калайда В.Т., Романенко В.В. Технология разработки программного обеспечения (1015641), страница 20
Текст из файла (страница 20)
В этом случае записывают число тестов, достаточное для того, чтобы все возможные результаты каждогоусловия в решении выполнялись, по крайней мере, один раз.Поскольку, как и при покрытии решений, это покрытие не всегда приводит к выполнению каждого оператора, к критериютребуется дополнение, которое заключается в том, что каждойточке входа в программу или подпрограмму, а также ON-единицам должно быть передано управление при вызове, по крайнеймере, один раз. Например, оператор цикла в языке ФортранDO К=0 ТО 50 WHILE (J+K<QUEST);или его аналог на языке Сиfor(K=0; K<=50 && J+K<QUEST; K++)содержит два условия: К меньше или равно 50 и J+K меньше,чем QUEST.
Следовательно, здесь требуются тесты для ситуаций K50, K>50 (т.е. выполнение последней итерации цикла),J+K<QUEST и J+KQUEST.Программа (рис. 6.5) имеет четыре условия: А > 1, В = 0,А = 2 и X > 1. Следовательно, требуется достаточное число тестов, такое, чтобы реализовать ситуации, где A > 1, A 1, B =0 и B 0 в точке a и A = 2, A 2 и X > 1 в точке b. Тесты,удовлетворяющие критерию покрытия условий, и соответствующие им пути:1. A = 2, В = 0, Х = 4 – ace.2. А = 1, B = 1, Х = 1 – abd.126Заметим, что хотя аналогичное число тестов для этогопримера уже было создано, покрытие условий обычно лучшепокрытия решений, поскольку оно может (но не всегда) вызвать выполнение решений в условиях, не реализуемых приперекрытии решений.
Например, рассмотренные выше операторы представляют собой двузначный переход (либо выполняетсятело цикла, либо выход из цикла). Если использовать тестирование решений, то достаточно выполнить цикл при изменении Kот 0 до 51 без проверки случая, когда второе условие ложно.Однако при критерии покрытия условий необходим тест, который реализовал бы результат «ложь» условия J+K<QUEST.Хотя применение критерия покрытия условий на первыйвзгляд удовлетворяет критерию покрытия решений, это не всегда так.
Если тестируется решение IF (A&B), то при критериипокрытия условий требовались бы два теста — A есть истина,B есть ложь и A есть ложь, B есть истина. Но в этом случае невыполнялось бы THEN-предложение оператора IF. Тесты критерия покрытия условий для ранее рассмотренного примера покрывают результаты всех решений, но это только случайноесовпадение.
Например, два альтернативных теста1. A = 1, В = 0, Х = 32. А = 2, В = 1, Х = 1покрывают результаты всех условий, но только два из четырехрезультатов решений (они оба покрывают путь abe и, следовательно, не выполняют результат истина первого решения и результат ложь второго решения).6.4.1.4 Покрытие решений/условийОчевидным следствием из этой дилеммы является критерий, названный покрытием решений/условий.
Он требует такогодостаточного набора тестов, чтобы все возможные результатыкаждого условия в решении выполнялись, по крайней мере,один раз, все результаты каждого решения выполнялись, покрайней мере, один раз и каждой точке входа передавалосьуправление, по крайней мере, один раз.Недостатком критерия покрытия решений/условий является невозможность его применения для выполнения всех результатов всех условий; часто подобное выполнение имеет ме-127сто вследствие того, что определенные условия скрыты другими условиями.
В качестве примера рассмотрим приведенную нарис. 6.6 схему передач управления в машинном коде программы на рис. 6.5. Многоусловные решения исходной программыздесь разбиты на отдельные решения и переходы, посколькубольшинство машин не имеет команд, реализующих решения смногими исходами.
Наиболее полное покрытие тестами в этомслучае осуществляется таким образом, чтобы выполнялись всевозможные результаты каждого простого решения.Два предыдущих теста критерия покрытия решений невыполняют этого. Они недостаточны для выполнения результата «ложь» решения Н и результата «истина» решения К. Набортестов для критерия покрытия условий такой программы такжеявляется неполным — два теста (которые случайно удовлетворяют также и критерию покрытия решений/условий) не вызывают выполнения результата «ложь» решения I и результата «истина» решения К.Причина этого заключается в том, что, как показано нарис.
6.6, результаты условий в выражениях и и или могут скрывать и блокировать действие других условий. Например, еслиусловие и есть ложь, то никакое из последующих условий в выражении не будет выполнено. Аналогично, если условие илиесть истина, то никакое из последующих условий не будет выполнено. Следовательно, критерии покрытия условий и покрытия решений/условий недостаточно чувствительны к ошибкам влогических выражениях.128HIA>1B=0YesNoYesNoX = X/AJA=2YesNoKX>1YesNoX=X+1Рис.
6.6 — Машинный код программы, изображенной на рис. 6.56.4.1.5 Комбинаторное покрытие условийКритерием, который решает эти и некоторые другиепроблемы, является комбинаторное покрытие условий. Он требует создания такого числа тестов, чтобы все возможные комбинации результатов условия в каждом решении и во всех точках входа выполнялись, по крайней мере, один раз.
Например, вприведенной ниже последовательности операторов существуютчетыре ситуации, которые должны быть протестированы:NOTFOUND = ’1’ В;/* поиск в таблице */DO I=1 ТО TABSIZE WHILE (NOTFOUND);/* последовательность операторов, реализующаяпроцедуру поиска */END;1291. ITABSIZE и NOTFOUND есть «истина».2.
ITABSIZE и NOTFOUND есть «ложь» (обнаружениенеобходимого искомого значения до достижения концатаблицы).3. I>TABSIZE и NOTFOUND есть «истина» (достижениеконца таблицы без обнаружения искомого значения).4. I>TABSIZE и NOTFOUND есть «ложь» (искомое значение является последней записью в таблице).Легко видеть, что набор тестов, удовлетворяющий критерию комбинаторного покрытия условий, удовлетворяет также икритериям покрытия решений, покрытия условий и покрытиярешений/условий.По этому критерию в программе на рис.
6.5 должны бытьпокрыты тестами следующие восемь комбинаций:1. A > 1, B = 02. A > 1, B ≠ 03. A ≤ 1, B = 04. A ≤ 1, B ≠ 05. А = 2, Х > 16. A = 2, X ≤ 17. A ≠ 2, Х > 18. A ≠ 2, X ≤ 1Заметим, что комбинации 5–8 представляют собой значения второго оператора IF. Поскольку Х может быть изменено довыполнения этого оператора, значения, необходимые для егопроверки, следует восстановить исходя из логики программы стем, чтобы найти соответствующие входные значения.Для того чтобы протестировать эти комбинации, необязательно использовать все восемь тестов.
Фактически они могутбыть покрыты четырьмя тестами. Приведем входные значениятестов и комбинации, которые они покрывают:A=2, B=0, Х=4 — покрывает 1, 5;А=2, B=1, Х=1 — покрывает 2, 6;А=1, B=0, Х=2 — покрывает 3, 7;A=1, B=1, X=1 — покрывает 4, 8.То, что четырем тестам соответствуют четыре различныхпути на рис. 6.5, является случайным совпадением. На самом130деле, представленные выше тесты не покрывают всех путей,они пропускают путь acd. Например, требуется восемь тестовдля тестирования следующей программы:IF ((X=Y) & (LENGTH(Z)=0) & EPS) THEN J=1;ELSE I=1;хотя она покрывается лишь двумя путями.
В случае циклов число тестов для удовлетворения критерию комбинаторного покрытия условий обычно больше, чем число путей.Таким образом, для программ, содержащих только одноусловие на каждое решение, минимальным является критерий,набор тестов которого1) вызывает выполнение всех результатов каждого решения, по крайней мере, один раз и2) передает управление каждой точке входа (например,точке входа, ON-единице), по крайней мере, один раз(чтобы обеспечить выполнение каждого операторапрограммы, по крайней мере, один раз).Для программ, содержащих решения, каждое из которыхимеет более одного условия, минимальный критерий состоит изнабора тестов, вызывающих выполнение всех возможных комбинаций результатов условий в каждом решении и передающихуправление каждой точке входа программы, по крайней мере,один раз.6.4.2 Эквивалентное разбиениеВ п. 6.2 отмечалось, что хороший тест имеет приемлемуювероятность обнаружения ошибки и что исчерпывающее входное тестирование программы невозможно.
Следовательно, тестирование программы ограничивается использованием небольшого подмножества всех возможных входных данных. Тогда, конечно, хотелось бы выбрать для тестирования самое подходящее подмножество (т.е. подмножество с наивысшей вероятностью обнаружения большинства ошибок).Правильно выбранный тест этого подмножества долженобладать двумя свойствами:а) уменьшать, причем более чем на единицу, число других тестов, которые должны быть разработаны для до-131стижения заранее определенной цели «приемлемого»тестирования;б) покрывать значительную часть других возможных тестов, что в некоторой степени свидетельствует о наличии или отсутствии ошибок до и после примененияэтого ограниченного множества значений входныхданных.Указанные свойства, несмотря на их кажущееся подобие,описывают два различных положения.