ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Проектирование информационных систем
Добавлен: 21.10.2018
Просмотров: 10786
Скачиваний: 8
126
ключения.
Первое
—
патологическая
ситуация,
когда
програм-
ма
не
имеет
решений.
Второе
встречается
в
программах
или
подпрограммах
с
несколькими
точками
входа;
данный
оператор
может
быть
выполнен
только
в
том
случае,
если
выполнение
программы
начинается
с
соответствующей
точки
входа.
Так
как
покрытие
операторов
считается
необходимым
условием,
по-
крытие
решений,
которое
представляется
более
сильным
крите-
рием,
должно
включать
покрытие
операторов.
Следовательно,
покрытие
решений
требует,
чтобы
каждое
решение
имело
ре-
зультатом
значение
истина
или
ложь
и
при
этом
каждый
опе-
ратор
выполнялся
бы,
по
крайней
мере,
один
раз.
Альтернатив-
ный
и
более
легкий
способ
выражения
этого
требования
состоит
в
том,
чтобы
каждое
решение
имело
результатом
значение
исти-
на
или
ложь
и
что
каждой
точке
входа
должно
быть
передано
управление
при
вызове
программы,
по
крайней
мере,
один
раз.
Изложенное
выше
предполагает
только
двузначные
ре-
шения
или
переходы
и
должно
быть
модифицировано
для
про-
грамм,
содержащих
многозначные
решения.
Примерами
таких
программ
являются:
•
программы
на
PL/1,
включающие
операторы
SELECT
(CASE)
или
операторы
GO
TO,
использующие
метку-
переменную;
•
программы
на
Фортране
с
вычисляемыми
операторами
GO
TO
или
операторами
GO
TO
по
предписанию;
•
программы
на
Бейсике
с
вычисляемыми
операторами
ON
—
GOTO,
ON
—
GOSUB;
•
программы
на
Коболе,
содержащие
операторы
GO
TO
вместе
с
ALTER
или
операторы
GO
ТО
—
DEPENDING
—
ON;
•
программы
на
Паскале,
использующие
операторы
CASE;
•
программы
на
языке
Си,
использующие
операторы
SWITCH
—
CASE;
•
любые
программы
с
арифметическими
операторами
IF.
Критерием
для
них
является
выполнение
каждого
воз-
можного
результата
всех
решений,
по
крайней
мере,
один
раз
и
127
передача
управления
при
вызове
программы
или
подпрограммы
каждой
точке
входа,
по
крайней
мере,
один
раз.
В
программе,
представленной
на
рис.
6.5,
покрытие
ре-
шений
может
быть
выполнено
двумя
тестами,
покрывающими
либо
пути
асе
и
abd,
либо
пути
acd
и
аbе.
Если
мы
выбираем
последнее
альтернативное
покрытие,
то
входами
двух
тестов
являются
A
=
3,
B
=
0,
X
=
3
и
A
=
2,
B
=
1,
X
=
1.
Покрытие
решений
—
более
сильный
критерий,
чем
по-
крытие
операторов,
но
и
он
имеет
свои
недостатки.
Например,
путь,
где
Х
не
изменяется
(если
выбрано
первое
альтернативное
покрытие),
будет
проверен
с
вероятностью
50 %.
Если
во
вто-
ром
решении
существует
ошибка
(например,
Х<1
вместо
Х>1),
то
ошибка
не
будет
обнаружена
двумя
тестами
предыдущего
примера.
6.4.1.3 Покрытие условий
Лучшим
критерием
по
сравнению
с
предыдущим
является
покрытие
условий.
В
этом
случае
записывают
число
тестов,
достаточное
для
того,
чтобы
все
возможные
результаты
каждо-
го
условия
в
решении
выполнялись,
по
крайней
мере,
один
раз.
Поскольку,
как
и
при
покрытии
решений,
это
покрытие
не
все-
гда
приводит
к
выполнению
каждого
оператора,
к
критерию
требуется
дополнение,
которое
заключается
в
том,
что
каждой
точке
входа
в
программу
или
подпрограмму,
а
также
ON-едини
-
цам
должно
быть
передано
управление
при
вызове,
по
крайней
мере,
один
раз.
Например,
оператор
цикла
в
языке
Фортран
DO
К=0 ТО 50 WHILE (J+K<QUEST);
или
его
аналог
на
языке
Си
for(K=0; K<=50 && J+K<QUEST; K++)
содержит
два
условия:
К
меньше
или
равно
50
и
J+K
меньше,
чем
QUEST.
Следовательно,
здесь
требуются
тесты
для
ситуа-
ций
K
≤50,
K>50
(т.е.
выполнение
последней
итерации
цикла),
J+K<QUEST
и
J+K
≥QUEST.
Программа
(
рис.
6.5)
имеет
четыре
условия:
А
>
1,
В
=
0,
А
=
2
и
X
>
1.
Следовательно,
требуется
достаточное
число
тес-
тов,
такое,
чтобы
реализовать
ситуации,
где
A
>
1,
A
≤
1,
B
=
0
и
128
B
≠
0
в
точке
a
и
A
=
2,
A
≠
2
и
X
>
1
в
точке
b.
Тесты,
удовле-
творяющие
критерию
покрытия
условий,
и
соответствующие
им
пути:
1.
A
=
2,
В
=
0,
Х
=
4
–
ace.
2.
А
=
1,
B
=
1,
Х
=
1
–
abd.
Заметим,
что
хотя
аналогичное
число
тестов
для
этого
примера
уже
было
создано,
покрытие
условий
обычно
лучше
покрытия
решений,
поскольку
оно
может
(но
не
всегда)
вы-
звать
выполнение
решений
в
условиях,
не
реализуемых
при
пе-
рекрытии
решений.
Например,
рассмотренные
выше
операторы
представляют
собой
двузначный
переход
(либо
выполняется
тело
цикла,
либо
выход
из
цикла).
Если
использовать
тестиро-
вание
решений,
то
достаточно
выполнить
цикл
при
изменении
K
от
0
до
51
без
проверки
случая,
когда
второе
условие
ложно.
Однако
при
критерии
покрытия
условий
необходим
тест,
кото-
рый
реализовал
бы
результат
«ложь»
условия
J+K<QUEST.
Хотя
применение
критерия
покрытия
условий
на
первый
взгляд
удовлетворяет
критерию
покрытия
решений,
это
не
все-
гда
так.
Если
тестируется
решение
IF
(A&B),
то
при
критерии
покрытия
условий
требовались
бы
два
теста
—
A
есть
истина,
B
есть
ложь
и
A
есть
ложь,
B
есть
истина.
Но
в
этом
случае
не
выполнялось
бы
THEN-предложение
оператора
IF.
Тесты
кри-
терия
покрытия
условий
для
ранее
рассмотренного
примера
по-
крывают
результаты
всех
решений,
но
это
только
случайное
совпадение.
Например,
два
альтернативных
теста
1.
A
=
1,
В
=
0,
Х
=
3
2.
А
=
2,
В
=
1,
Х
=
1
покрывают
результаты
всех
условий,
но
только
два
из
четырех
результатов
решений
(они
оба
покрывают
путь
abe
и,
следова-
тельно,
не
выполняют
результат
истина
первого
решения
и
ре-
зультат
ложь
второго
решения).
6.4.1.4 Покрытие решений/условий
Очевидным
следствием
из
этой
дилеммы
является
крите-
рий,
названный
покрытием
решений/условий.
Он
требует
такого
достаточного
набора
тестов,
чтобы
все
возможные
результаты
129
каждого
условия
в
решении
выполнялись,
по
крайней
мере,
один
раз,
все
результаты
каждого
решения
выполнялись,
по
крайней
мере,
один
раз
и
каждой
точке
входа
передавалось
управление,
по
крайней
мере,
один
раз.
Недостатком
критерия
покрытия
решений/условий
явля-
ется
невозможность
его
применения
для
выполнения
всех
ре-
зультатов
всех
условий;
часто
подобное
выполнение
имеет
ме-
сто
вследствие
того,
что
определенные
условия
скрыты
други-
ми
условиями.
В
качестве
примера
рассмотрим
приведенную
на
рис.
6.6
схему
передач
управления
в
машинном
коде
програм-
мы
на рис.
6.5.
Многоусловные
решения
исходной
программы
здесь
разбиты
на
отдельные
решения
и
переходы,
поскольку
большинство
машин
не
имеет
команд,
реализующих
решения
с
многими
исходами.
Наиболее
полное
покрытие
тестами
в
этом
случае
осуществляется
таким
образом,
чтобы
выполнялись
все
возможные
результаты
каждого
простого
решения.
Два
предыдущих
теста
критерия
покрытия
решений
не
выполняют
этого.
Они
недостаточны
для
выполнения
результа-
та
«ложь»
решения
Н
и
результата
«истина»
решения
К.
Набор
тестов
для
критерия
покрытия
условий
такой
программы
также
является
неполным
—
два
теста
(которые
случайно
удовлетво-
ряют
также
и
критерию
покрытия
решений/условий)
не
вызы-
вают
выполнения
результата
«ложь»
решения
I
и
результата
«истина»
решения
К.
Причина
этого
заключается
в
том,
что,
как
показано
на
рис.
6.6,
результаты
условий
в
выражениях
и
и
или
могут
скры-
вать
и
блокировать
действие
других
условий.
Например,
если
условие
и
есть
ложь,
то
никакое
из
последующих
условий
в
выражении
не
будет
выполнено.
Аналогично,
если
условие
или
есть
истина,
то
никакое
из
последующих
условий
не
будет
вы-
полнено.
Следовательно,
критерии
покрытия
условий
и
покры-
тия
решений/условий
недостаточно
чувствительны
к
ошибкам
в
логических
выражениях.
130
Рис.
6.6
—
Машинный
код
программы,
изображенной
на
рис.
6.5
6.4.1.5 Комбинаторное покрытие условий
Критерием,
который
решает
эти
и
некоторые
другие
про-
блемы,
является
комбинаторное
покрытие
условий.
Он
требует
создания
такого
числа
тестов,
чтобы
все
возможные
комбина-
ции
результатов
условия
в
каждом
решении
и
во
всех
точках
входа
выполнялись,
по
крайней
мере,
один
раз.
Например,
в
приведенной
ниже
последовательности
операторов
существуют
четыре
ситуации,
которые
должны
быть
протестированы:
NOTFOUND = ’1’
В;
/*
поиск в таблице */
DO I=1
ТО TABSIZE WHILE (NOTFOUND);
/*
последовательность операторов, реализующая
процедуру поиска */
END;
A
>
1
X
=
X/A
No
Yes
H
B
=
0
I
Yes
No
A
=
2
X
>
1
X
=
X
+
1
No
No
Yes
Yes
J
K