ВУЗ: Томский государственный университет систем управления и радиоэлектроники
Категория: Учебное пособие
Дисциплина: Проектирование информационных систем
Добавлен: 21.10.2018
Просмотров: 10785
Скачиваний: 8
131
1.
I
≤TABSIZE
и
NOTFOUND
есть
«истина».
2.
I
≤TABSIZE
и
NOTFOUND
есть
«ложь»
(обнаружение
необходимого
искомого
значения
до
достижения
конца
таблицы).
3.
I>TABSIZE
и
NOTFOUND
есть
«истина»
(достижение
конца
таблицы
без
обнаружения
искомого
значения).
4.
I>TABSIZE
и
NOTFOUND
есть
«ложь»
(искомое
зна-
чение
является
последней
записью
в
таблице).
Легко
видеть,
что
набор
тестов,
удовлетворяющий
крите-
рию
комбинаторного
покрытия
условий,
удовлетворяет
также
и
критериям
покрытия
решений,
покрытия
условий
и
покрытия
решений/условий.
По
этому
критерию
в
программе
на
рис.
6.5
должны
быть
покрыты
тестами
следующие
восемь
комбинаций:
1.
A
>
1,
B
=
0
2.
A
>
1,
B
≠
0
3.
A
≤
1,
B
=
0
4.
A
≤
1,
B
≠
0
5.
А
=
2,
Х
>
1
6.
A
=
2,
X
≤
1
7.
A
≠
2,
Х
>
1
8.
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,
является
случайным
совпадением.
На
самом
132
деле,
представленные
выше
тесты
не
покрывают
всех
путей,
они
пропускают
путь
acd.
Например,
требуется
восемь
тестов
для
тестирования
следующей
программы:
IF ((X=Y) & (LENGTH(Z)=0) & EPS) THEN J=1;
ELSE I=1;
хотя
она
покрывается
лишь
двумя
путями.
В
случае
циклов
число
тестов
для
удовлетворения
критерию
комбинаторного
покрытия
условий
обычно
больше,
чем
число
путей.
Таким
образом,
для
программ,
содержащих
только
одно
условие
на
каждое
решение,
минимальным
является
критерий,
набор
тестов
которого
1)
вызывает
выполнение
всех
результатов
каждого
реше-
ния,
по
крайней
мере,
один
раз
и
2)
передает
управление
каждой
точке
входа
(например,
точке
входа,
ON-единице),
по
крайней
мере,
один
раз
(чтобы
обеспечить
выполнение
каждого
оператора
программы,
по
крайней
мере,
один
раз).
Для
программ,
содержащих
решения,
каждое
из
которых
имеет
более
одного
условия,
минимальный
критерий
состоит
из
набора
тестов,
вызывающих
выполнение
всех
возможных
ком-
бинаций
результатов
условий
в
каждом
решении
и
передающих
управление
каждой
точке
входа
программы,
по
крайней
мере,
один
раз.
6.4.2 Эквивалентное разбиение
В
п.
6.2
отмечалось,
что
хороший
тест
имеет
приемлемую
вероятность
обнаружения
ошибки
и
что
исчерпывающее
вход-
ное
тестирование
программы
невозможно.
Следовательно,
тес-
тирование
программы
ограничивается
использованием
неболь-
шого
подмножества
всех
возможных
входных
данных.
Тогда,
конечно,
хотелось
бы
выбрать
для
тестирования
самое
подхо-
дящее
подмножество
(т.е.
подмножество
с
наивысшей
вероят-
ностью
обнаружения
большинства
ошибок).
Правильно
выбранный
тест
этого
подмножества
должен
обладать
двумя
свойствами:
133
а)
уменьшать,
причем
более
чем
на
единицу,
число
дру-
гих
тестов,
которые
должны
быть
разработаны
для
достижения
заранее
определенной
цели
«приемлемо-
го»
тестирования;
б)
покрывать
значительную
часть
других
возможных
тес-
тов,
что
в
некоторой
степени
свидетельствует
о
нали-
чии
или
отсутствии
ошибок
до
и
после
применения
этого
ограниченного
множества
значений
входных
данных.
Указанные
свойства,
несмотря
на
их
кажущееся
подобие,
описывают
два
различных
положения.
Во-первых,
каждый
тест
должен
включать
столько
различных
входных
условий,
сколько
это
возможно,
с
тем,
чтобы
минимизировать
общее
число
необ-
ходимых
тестов.
Во-вторых,
необходимо
пытаться
разбить
входную
область
программы
на
конечное
число
классов
эквива-
лентности
так,
чтобы
можно
было
предположить
(конечно,
не
абсолютно
уверенно),
что
каждый
тест,
являющийся
представи-
телем
некоторого
класса,
эквивалентен
любому
другому
тесту
этого
класса.
Иными
словами,
если
один
тест
класса
эквива-
лентности
обнаруживает
ошибку,
то
следует
ожидать,
что
и
все
другие
тесты
этого
класса
эквивалентности
будут
обнаруживать
ту
же
самую
ошибку.
Наоборот,
если
тест
не
обнаруживает
ошибки,
то
следует
ожидать,
что
ни
один
тест
этого
класса
эк-
вивалентности
не
будет
обнаруживать
ошибки
(в
том
случае,
когда
некоторое
подмножество
класса
эквивалентности
не
по-
падает
в
пределы
любого
другого
класса
эквивалентности,
так
как
классы
эквивалентности
могут
пересекаться).
Эти
два
положения
составляют
основу
методологии
тес-
тирования
по
принципу
черного
ящика,
известной
как
эквива-
лентное
разбиение.
Второе
положение
используется
для
разра-
ботки
набора
«интересных»
условий,
которые
должны
быть
протестированы,
а
первое
—
для
разработки
минимального
на-
бора
тестов,
покрывающих
эти
условия.
Примером
класса
эквивалентности
для
программы
о
тре-
угольнике
(см.
п.
6.2.1)
является
набор
«трех
равных
чисел,
имеющих
целые
значения,
большие
нуля».
Определяя
этот
на-
бор
как
класс
эквивалентности,
устанавливают,
что
если
ошиб-
134
ка
не
обнаружена
некоторым
тестом
данного
набора,
то
мало-
вероятно,
что
она
будет
обнаружена
другим
тестом
набора.
Иными
словами,
в
этом
случае
время
тестирования
лучше
за-
тратить
на
что-нибудь
другое
(на
тестирование
других
классов
эквивалентности).
Разработка
тестов
методом
эквивалентного
разбиения
осуществляется
в
два
этапа:
1)
выделение
классов
эквивалентности
и
2)
построение
тестов.
6.4.2.1 Выделение классов эквивалентности
Классы
эквивалентности
выделяются
путем
выбора
каж-
дого
входного
условия
(обычно
это
предложение
или
фраза
в
спецификации)
и
разбиением
его
на
две
или
более
групп.
Для
проведения
этой
операции
используют
таблицу,
изображенную
на
рис.
6.7.
Входные
условия
Правильные
классы
эквива-
лентности
Неправильные
классы
эквива-
лентности
Рис.
6.7
—
Форма
таблицы
для
перечисления
классов
эквивалентности
Заметим,
что
различают
два
типа
классов
эквивалентно-
сти:
правильные
классы
эквивалентности,
представляющие
пра-
вильные
входные
данные
программы,
и
неправильные
классы
эквивалентности,
представляющие
все
другие
возможные
со-
стояния
условий
(т.е.
ошибочные
входные
значения).
Таким
образом,
придерживаются
одного
из
принципов
п.
6.2
о
необхо-
димости
сосредоточивать
внимание
на
неправильных
или
не-
ожиданных
условиях.
Если
задаться
входными
или
внешними
условиями,
то
выделение
классов
эквивалентности
представляет
собой
в
зна-
чительной
степени
эвристический
процесс.
При
этом
существу-
ет
ряд
правил:
135
1.
Если
входное
условие
описывает
область
значений
(например,
«целое
данное
может
принимать
значения
от
1
до
999»),
то
определяются:
−
один
правильный
класс
эквивалентности
(значений
от
1
до
999);
−
два
неправильных
класса
(значения
целого
данного
<1
и
значение
целого
данного
>999).
2.
Если
входное
условие
описывает
число
значений
(на-
пример,
«в
автомобиле
могут
ехать
от
одного
до
шести
чело-
век»),
то
определяются
один
правильный
класс
эквивалентно-
сти
и
два
неправильных
(ни
одного
и
более
шести).
3.
Если
входное
условие
описывает
множество
входных
значений
и
есть
основание
полагать,
что
каждое
значение
про-
грамма
трактует
особо
(например,
«известны
способы
передви-
жения
на
АВТОБУСЕ,
ГРУЗОВИКЕ,
ТАКСИ,
ПЕШКОМ
или
МОТОЦИКЛЕ»),
то
определяется
правильный
класс
эквива-
лентности
для
каждого
значения
и
один
неправильный
класс
эквивалентности
(например,
«НА
ПРИЦЕПЕ»).
4.
Если
входное
условие
описывает
ситуацию
«должно
быть»
(например,
«первым
символом
идентификатора
должна
быть
буква»),
то
определяется
один
правильный
класс
эквива-
лентности
(первый
символ
—
буква)
и
один
неправильный
(пер-
вый
символ
—
не
буква).
5.
Если
есть
любое
основание
считать,
что
различные
элементы
класса
эквивалентности
трактуются
программой
не-
одинаково,
то
данный
класс
эквивалентности
разбивается
на
меньшие
классы
эквивалентности.
Этот
процесс
ниже
будет
кратко
проиллюстрирован.
6.4.2.2 Построение тестов
Второй
шаг
заключается
в
использовании
классов
эквива-
лентности
для
построения
тестов.
Этот
процесс
включает
в
себя:
1.
Назначение
каждому
классу
эквивалентности
уникаль-
ного
номера.
2.
Проектирование
новых
тестов,
каждый
из
которых
по-
крывает
как
можно
большее
число
правильных
непокрытых
классов
эквивалентности,
до
тех
пор,
пока
все
правильные
клас-