ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.11.2019
Просмотров: 9517
Скачиваний: 184
Покрытие
решений
(
переходов
).
Для
реализации
этого
критерия
необходимо
такое
количество
и
состав
тестов
,
чтобы
результат
проверки
каждого
условия
(
т
.
е
.
решение
)
принимал
значения
«
истина
»
или
«
ложь
»,
по
крайней
мере
,
один
раз
.
Нетрудно
видеть
,
что
критерий
покрытия
решений
удовлетворяет
критерию
покрытия
операторов
,
но
является
более
«
сильным
».
Программу
,
алгоритм
которой
представлен
на
рис
. 9.2,
а
,
можно
протестировать
по
методу
покрытия
решений
двумя
тестами
,
покрывающими
либо
пути
: 1-2-4-6, 1-2-3-4-5-6,
либо
пути
:
1-2-3-4-6, 1-2-4-5-6,
например
:
а
= 3,
Ь
= 0,
х
= 3—
путь
1-2-3-4-5-6;
а
= 2, b = 1,
х
= I —
путь
1-2-4-6.
Однако
путь
,
где
х
не
меняется
,
будет
проверен
с
вероятностью
50 %:
если
во
втором
условии
вместо
условия
х
>
1
записано
х
< 1,
то
этими
двумя
тестами
ошибка
обнаружена
не
будет
.
Покрытие
условий
.
Критерий
покрытия
условий
является
еще
более
«
сильным
»
по
сравнению
с
предыдущими
.
В
этом
случае
формируют
некоторое
количество
тестов
,
достаточное
для
того
,
чтобы
все
возможные
результаты
каждого
условия
в
решении
были
выполнены
,
по
крайней
мере
,
один
раз
.
Однако
,
как
и
в
случае
покрытия
решений
,
этот
критерий
не
всегда
приводит
к
выполнению
каждого
оператора
,
по
крайней
мере
,
один
раз
.
К
критерию
требуется
дополнение
,
заключающееся
в
том
,
что
каждой
точке
входа
управление
должно
быть
передано
,
по
крайней
мере
,
один
раз
.
Программа
,
алгоритм
которой
представлен
на
рис
. 9.2,
а
,
проверяет
четыре
условия
:
1)
а
>1; 2)
Ь
= 0;
3)
а
= 2; 4)
х
>1.
Необходимо
реализовать
все
возможные
ситуации
:
а
>1,
а
≥
1,
b = 0, b
≠
0,
а
= 2,
а
≠
2,
х
>1,
х
≤
1.
Тесты
,
удовлетворяющие
этому
условию
:
а
= 2,
Ь
= 0,
х
= 4 —
путь
1-2-3-4-5-6,
условия
: 1 -
да
, 2 -
да
, 3 -
да
, 4 -
да
;
а
= 1, b = 1,
х
= 1 —
путь
1-2-4-6,
условия
: 1 -
нет
, 2 -
нет
, 3 -
нет
, 4 -
нет
.
Критерий
покрытия
условий
часто
удовлетворяет
критерию
покрытия
решений
,
но
не
всегда
.
Тесты
критерия
покрытия
условий
для
ранее
рассмотренных
примеров
покрывают
результаты
всех
решений
,
но
это
случайное
совпадение
.
Например
,
тесты
:
а
= 1, b = 0,
х
= 3 —
путь
1-2-3-6,
условия
: 1 -
нет
, 2 -
да
, 3 -
нет
, 4 -
да
;
а
= 2, b = 1,
х
= 1 —
путь
1-2-3-4-5-6,
условия
: 1 -
да
, 2 -
нет
, 3 -
да
, 4 -
нет
покрывают
результаты
всех
условий
,
но
только
два
из
четырех
результатов
решений
:
не
выполняется
результат
«
истина
»
первого
решения
и
результат
«
ложь
»
второго
.
Основной
недостаток
метода
-
недостаточная
чувствительность
к
ошибкам
в
логических
выражениях
.
Покрытие
решений
/
условий
.
Согласно
этому
методу
тесты
должны
составляться
так
,
чтобы
,
по
крайней
мере
,
один
раз
выполнились
все
возможные
результаты
каждого
условия
и
все
результаты
каждого
решения
,
и
каждому
оператору
управление
передавалось
,
по
крайней
мере
,
один
раз
.
Анализ
,
проведенный
выше
,
показывает
,
что
этому
критерию
удовлетворяют
тесты
:
а
-2, b = 0,
х
= 4 —
путь
1-2-3-4-5-6,
условия
: 1 -
да
, 2 -
да
, 3 -
да
, 4 -
да
;
а
= 1 ,
Ь
= 1 ,
х
= 1 —
путь
1-2-4-6,
условия
; 1 -
нет
, 2 -
нет
, 3 -
нет
, 4 -
нет
.
Комбинаторное
покрытие
условий
.
Этот
критерий
требует
создания
такого
множества
тестов
,
чтобы
все
возможные
комбинации
результатов
условий
в
каждом
решении
и
все
операторы
выполнялись
,
по
крайней
мере
,
один
раз
.
Для
программы
,
алгоритм
которой
представлен
на
рис
. 9.1,
необходимо
покрыть
тестами
восемь
комбинаций
:
1)
а
>1, b = 0;
5)
а
= 2,
х
> 1;
2)
а
>1, b
≠
0; 6)
а
= 2,
х
≤
1;
3)
а
≤
1,b = 0;
7)
а
≠
2,
х
> 1;
4)
а
≤
1; b
≠
0; 8)
а
≠
2,
х
≤
1.
Эти
комбинации
можно
проверить
четырьмя
тестами
:
а
= 2, b = 0,
х
= 4 —
проверяет
комбинации
(1), (5);
а
= 2, b = 1 ,
х
= 1 —
проверяет
комбинации
(2), (6);
а
= 1 , b = 0,
х
= 2 —
проверяет
комбинации
(3), (7);
а
= 1 , b = 1 ,
х
= 1 —
проверяет
комбинации
(4), (8).
В
данном
случае
то
,
что
четырем
тестам
соответствует
четыре
пути
,
является
совпадением
.
Представленные
тесты
не
покрывают
всех
путей
,
например
, acd.
Поэтому
иногда
необходима
реализация
восьми
тестов
.
Таким
образом
,
для
программ
,
содержащих
только
одно
условие
на
каждое
решение
,
минимальным
является
набор
тестов
,
который
проверяет
все
результаты
каждого
решения
и
передает
управление
каждому
оператору
,
по
крайней
мере
,
один
раз
.
Для
программ
,
содержащих
вычисления
,
каждое
из
которых
требует
проверки
более
чем
одного
условия
,
минимальный
набор
тестов
должен
:
•
генерировать
все
возможные
комбинации
результатов
проверок
условий
для
каждого
вычисления
;
•
передавать
управление
каждому
оператору
,
по
крайней
мере
,
один
раз
.
Термин
«
возможных
»
употреблен
здесь
потому
,
что
некоторые
комбинации
условий
могут
быть
нереализуемы
.
Например
,
для
комбинации
k<0
и
к
>40
задать
k
невозможно
.
9.4.
Функциональное
тестирование
Одним
из
способов
проверки
программ
является
тестирование
с
управлением
по
данным
или
по
принципу
«
черного
ящика
».
В
этом
случае
программа
рассматривается
как
«
черный
ящик
»,
и
целью
тестирования
является
выяснение
обстоятельств
,
в
которых
поведение
программы
не
соответствует
спецификации
.
Для
обнаружения
всех
ошибок
в
программе
,
используя
управление
по
данным
,
необходимо
выполнить
исчерпывающее
тестирование
,
т
.
е
.
тестирование
на
всех
возможных
наборах
данных
.
Для
тех
же
программ
,
где
исполнение
команды
зависит
от
предшествующих
ей
событий
,
необходимо
проверить
и
все
возможные
последовательности
.
Очевидно
,
что
проведение
исчерпывающего
тестирования
для
подавляющего
большинства
случаев
невозможно
.
Поэтому
обычно
выполняют
«
разумное
»
или
«
приемлемое
»
тестирование
,
которое
ограничивается
прогонами
программы
на
небольшом
подмножестве
всех
возможных
входных
данных
.
Этот
вариант
не
дает
гарантии
отсутствия
отклонений
от
спецификаций
.
Правильно
выбранный
тест
должен
уменьшать
,
причем
более
чем
на
единицу
,
число
других
тестов
,
которые
должны
быть
разработаны
для
обеспечения
требуемого
качества
программного
обеспечения
.
При
функциональном
тестировании
различают
следующие
методы
формирования
тестовых
наборов
:
•
эквивалентное
разбиение
;
•
анализ
граничных
значений
;
•
анализ
причинно
-
следственных
связей
;
•
предположение
об
ошибке
.
Эквивалентное
разбиение
.
Метод
эквивалентного
разбиения
заключается
в
следующем
.
Область
всех
возможных
наборов
входных
данных
программы
по
каждому
параметру
разбивают
на
конечное
число
групп
-
классов
эквивалентности
.
Наборы
данных
такого
класса
объединяют
по
принципу
обнаружения
одних
и
тех
же
ошибок
:
если
набор
какого
-
либо
класса
обнаруживает
некоторую
ошибку
,
то
предполагается
,
что
все
другие
тесты
этого
класса
эквивалентности
тоже
обнаружат
эту
ошибку
и
наоборот
.
Разработку
тестов
методом
эквивалентного
разбиения
осуществляют
в
два
этапа
:
на
первом
выделяют
классы
эквивалентности
,
а
на
втором
-
формируют
тесты
.
Выделение
классов
эквивалентности
является
эвристическим
процессом
,
однако
целесообразным
считают
выделять
в
отдельные
классы
эквивалентности
наборы
,
содержащие
допустимые
и
недопустимые
значения
некоторого
параметра
.
При
этом
существует
ряд
правил
:
•
если
некоторый
параметр
х
может
принимать
значения
в
интервале
[1, 999],
то
выделяют
один
правильный
класс
1
≤
х
≤
999
и
два
неправильных
:
х
< I
их
>999;
•
если
входное
условие
определяет
диапазон
значений
порядкового
типа
,
например
, «
в
автомобиле
могут
ехать
от
одного
до
шести
человек
»,
то
определяется
один
правильный
класс
эквивалентности
и
два
неправильных
:
ни
одного
и
более
шести
человек
;
•
если
входное
условие
описывает
множество
входных
значений
и
есть
основания
полагать
,
что
каждое
значение
программист
трактует
особо
,
например
, «
типы
графических
файлов
: bmp,
jpeg, vsd»,
то
определяют
правильный
класс
эквивалентности
для
каждого
значения
и
один
неправильный
класс
,
например
, txt;
•
если
входное
условие
описывает
ситуацию
«
должно
быть
»,
например
, «
первым
символом
идентификатора
должна
быть
буква
»,
то
определяется
один
правильный
класс
эквивалентности
(
первый
символ
-
буква
)
и
один
неправильный
(
первый
символ
-
не
буква
);
•
если
есть
основание
считать
,
что
различные
элементы
класса
эквивалентности
трактуются
программой
неодинаково
,
то
данный
класс
разбивается
на
меньшие
классы
эквивалентности
.
Таким
образом
,
классы
эквивалентности
выделяют
,
перебирая
ограничения
,
установленные
для
каждого
входного
значения
в
техническом
задании
или
при
уточнении
спецификации
.
Каждое
ограничение
разбивают
на
две
или
более
групп
.
При
этом
используют
специальные
бланки
-
таблицы
классов
эквивалентности
:
Ограничение
на
значение
параметра
Правильные
классы
эквивалентности
Неправильные
классы
эквивалентности
Правильные
классы
включают
правильные
данные
,
неправильные
классы
-
неправильные
данные
.
Для
правильных
и
неправильных
классов
тесты
проектируют
отдельно
.
При
построении
тестов
правильных
классов
учитывают
,
что
каждый
тест
должен
проверять
по
возможности
максимальное
количество
различных
входных
условий
.
Такой
подход
позволяет
минимизировать
общее
число
необходимых
тестов
.
Для
каждого
неправильного
класса
эквивалентности
формируют
свой
тест
.
Последнее
обусловлено
тем
,
что
определенные
проверки
с
ошибочными
входами
скрывают
или
заменяют
другие
проверки
с
ошибочными
входами
.
Анализ
граничных
значений
.
Граничные
значения
-
это
значения
на
границах
классов
эквивалентности
входных
значений
или
около
них
.
Анализ
показывает
,
что
в
этих
местах
резко
увеличивается
возможность
обнаружения
ошибок
.
Например
,
если
в
программе
анализа
вида
треугольника
было
записано
А
+
В
≥
С
вместо
А
+
В
>
С
,
то
задание
граничных
значений
приве
-
дет
к
ошибке
:
линия
будет
отнесена
к
одному
из
видов
треугольника
.
Применение
метода
анализа
граничных
значений
требует
определенной
степени
творчества
и
специализации
в
рассматриваемой
проблеме
.
Тем
не
менее
существует
несколько
общих
правил
для
применения
этого
метода
:
•
если
входное
условие
описывает
область
значений
,
то
следует
построить
тесты
для
границ
области
и
тесты
с
неправильными
входными
данными
для
ситуаций
незначительного
выхода
за
границы
области
,
например
,
если
описана
область
[-1.0, +1.0],
то
должны
быть
сгенерированы
тесты
: -1.0, + 1.0,-1.001
и
+1.001;
•
если
входное
условие
удовлетворяет
дискретному
ряду
значений
,
то
следует
построить
тесты
для
минимального
и
максимального
значений
и
тесты
,
содержащие
значения
большие
и
меньшие
этих
двух
значений
,
например
,
если
входной
файл
может
содержать
от
1
до
255
записей
,
то
следует
проверить
О
, 1, 255
и
256
записей
;
•
если
существуют
ограничения
выходных
значений
,
то
целесообразно
аналогично
тестировать
и
их
:
конечно
не
всегда
можно
получить
результат
вне
выходной
области
,
но
тем
не
менее
стоит
рассмотреть
эту
возможность
;
•
если
некоторое
входное
или
выходное
значение
программы
является
упорядоченным
множеством
,
например
,
это
последовательный
файл
,
линейный
список
или
таблица
,
то
следует
сосредоточить
внимание
на
первом
и
последнем
элементах
этого
множества
.
Помимо
указанных
граничных
значений
,
целесообразно
поискать
другие
.
Анализ
граничных
значений
,
если
он
применен
правильно
,
является
одним
из
наиболее
полезных
методов
проектирования
тестов
.
Однако
следует
помнить
,
что
граничные
значения
могут
быть
едва
уловимы
и
определение
их
связано
с
большими
трудностями
,
что
является
недостатком
этого
метода
.
Оба
описанных
метода
основаны
на
исследовании
входных
данных
.
Они
не
позволяют
проверять
результаты
,
получаемые
при
различных
сочетаниях
данных
.
Для
построения
тестов
,
проверяющих
сочетания
данных
,
применяют
методы
,
использующие
булеву
алгебру
.
Анализ
причинно
-
следственных
связей
.
Анализ
причинно
-
следственных
связей
позволяет
системно
выбирать
высокорезультативные
тесты
.
Метод
использует
алгебру
логики
и
оперирует
понятиями
«
причина
»
и
«
следствие
».
Причиной
в
данном
случае
называют
отдельное
входное
условие
или
класс
эквивалентности
.
Следствием
-
выходное
условие
или
преобразование
системы
.
Идея
метода
заключается
в
отнесении
всех
следствий
к
причинам
,
т
.
е
.
в
уточнении
причинно
-
следственных
связей
.
Данный
метод
дает
полезный
побочный
эффект
,
позволяя
обнаруживать
неполноту
и
неоднозначность
исходных
спецификаций
.
Построение
тестов
осуществляют
в
несколько
этапов
.
Сначала
,
поскольку
таблицы
причинно
-
следственных
связей
при
применении
метода
к
большим
спецификациям
становятся
громоздкими
,
спецификации
разбивают
на
«
рабочие
»
участки
,
стараясь
по
возможности
выделять
в
отдельные
таблицы
независимые
группы
причинно
-
следственных
связей
.
Затем
в
спецификации
определяют
множество
причин
и
следствий
.
Далее
на
основе
анализа
семантического
(
смыслового
)
содержания
спецификации
строят
таблицу
истинности
,
в
которой
каждой
возможной
комбинации
причин
ставится
в
соответствие
следствие
.
При
этом
целесообразно
истину
обозначать
«I»,
ложь
- «
О
»,
а
для
обозначения
безразличных
состояний
условий
применять
обозначение
«X»,
которое
предполагает
произволь
-
ное
значение
условия
(0
или
1).
Таблицу
сопровождают
примечаниями
,
задающими
ограничения
и
описывающими
комбинации
причин
и
/
или
следствий
.
которые
являются
невозможными
из
-
за
синтаксических
или
внешних
ограничений
.
При
необходимости
аналогично
строится
таблица
истинности
для
класса
эквивалентности
.
И
,
наконец
,
каждую
строку
таблицы
преобразуют
в
тест
.
При
этом
рекомендуется
по
возможности
совмещать
тесты
из
независимых
таблиц
.
Данный
метод
позволяет
строить
высокорезультативные
тесты
и
обнаруживать
неполноту
и
неоднозначность
исходных
спецификаций
.
Его
недостатком
является
неадекватное
исследование
граничных
значений
.
Предположение
об
ошибке
.
Часто
программист
с
большим
опытом
находит
ошибки
, «
не
применяя
никаких
методов
».
На
самом
деле
он
подсознательно
использует
метод
«
предположение
об
ошибке
».
Процедура
метода
предположения
об
ошибке
в
значительной
степени
основана
на
интуиции
.
Основная
его
идея
заключается
в
том
,
чтобы
перечислить
в
некотором
списке
возможные
ошибки
или
ситуации
,
в
которых
они
могут
появиться
,
а
затем
на
основе
этого
списка
составить
тесты
.
Другими
словами
,
требуется
перечислить
те
особые
случаи
,
которые
могут
быть
не
учтены
при
проектировании
.
Проиллюстрируем
применение
всех
рассмотренных
выше
методов
на
примере
.
Пример
9.1.
Пусть
необходимо
выполнить
тестирование
программы
,
определяющей
точку
пересечения
двух
прямых
на
плоскости
.
При
этом
она
должна
определять
параллельность
прямой
одной
из
осей
координат
.
В
основе
программы
лежит
решение
системы
линейных
уравнений
:
Ах
+ By =
С
,
Dx +
Еу
= F.
По
методу
э
к
в
и
в
а
л
е
н
т
н
ы
х
р
а
з
б
и
е
н
и
й
формируем
для
каждого
коэффициента
один
правильный
класс
эквивалентности
(
коэффициент
-
вещественное
число
)
и
один
неправильный
(
коэффициент
-
не
вещественное
число
).
Откуда
генерируем
7
тестов
:
1)
все
коэффициенты
-
вещественные
числа
(1
тест
);
2-7)
поочередно
каждый
из
коэффициентов
-
не
вещественное
число
(6
тестов
).
По
методу
г
р
а
н
и
ч
н
ы
х
з
н
а
ч
е
н
и
й
можно
считать
,
что
для
исходных
данных
граничные
значения
отсутствуют
,
т
.
е
.
коэффициенты
- «
любые
»
вещественные
числа
.
Для
результатов
получаем
,
что
возможны
варианты
:
единственное
решение
,
прямые
сливаются
-
множество
решений
,
прямые
параллельны
-
отсутствие
решений
.
Следовательно
,
целесообразно
предложить
тесты
с
результатами
внутри
областей
возможных
значений
результатов
:
8)
результат
-
единственное
решение
(
)
0
≠
δ
;
9)
результат
-
множество
решений
(
)
0
0
=
=
=
y
x
и
δ
δ
δ
;
10)
результат
-
отсутствие
решений
(
)
0
0
,
0
≠
≠
=
y
x
или
но
δ
δ
δ
;
и
с
результатами
на
границе
:
11)
;
01
,
0
=
δ
12)
;
01
,
0
−
=
δ
13)
;
0
,
01
,
0
,
0
=
=
=
y
x
δ
δ
δ
14)
.
0
,
01
,
0
,
0
=
−
=
=
x
y
δ
δ
δ
По
методу
а
н
а
л
и
з
а
п
р
и
ч
и
н
н
о
–
с
л
е
д
с
т
в
е
н
н
ы
х
с в я з е й
определяем
множество
условий
:
а
)
для
определения
типа
прямой
:
а
= 0
b = 0 -
для
определения
типа
и
существования
первой
прямой
;
с
= 0