Domain-тестирование – формальное название методики тестирования, за которым скрывается банальная работа с классами эквивалентности. Впрочем, не такая уж и банальная. Даже в популярной литературе по тестированию часто упоминают только о существовании классов эквивалентности и о том, что с их граничными значениями работать очень полезно.
Мы знакомимся с основами этой методики, когда делаем первые шаги в тестировании, и больше никогда о ней не задумываемся, наивно считая, что она попала в нашу зону неосознанной компетентности и мы всегда используем ее правильно. А так ли это?
4. Введем определения
Domain (англ., мат.) – область определения
Domain-тестирование – метод
тестирования, в основе которого лежит
работа с областями определений.
4
5. Синхронизируем словари:
Рассмотрим P = f (A, B), где
P – некая программа, которая
f (A, B) – является функцией
A, B – двух параметров
A={a1, .., an} и B={b1, .., bm} – области всех
возможных значений (валидных и нет)
a1, a2,.., b1, b2 .. – экземпляры (значения)
класса
5
6. Какие задачи решает DT?
1) разбиение областей значений на
подобласти
2) выбор конкретных значений из
подобластей
3) сочетание выбранных значений разных
параметров
6
7. Зачем нужно..
разбиение областей
значений на подобласти –
– невозможно протестировать на всех
возможных значениях, конфигурациях и
условиях
7
8. Зачем нужен..
выбор конкретных
значений из подобластей –
– для минимизации риска ошибок, связанных
с неверным выделением подобластей
8
9. Зачем нужно..
сочетание выбранных значений –
– для увеличения области покрытия, и
обнаружения дефектов, которые зависят от
взаимодействия двух и более параметров
9
11. Определения
Множество – набор элементов,
объединенных некоторым общим
признаком.
Класс эквивалентности – множество, все
элементы которого программа
обрабатывает эквивалентно (исполняясь по
одному пути).
11
12. С чего начать выделение КЭ?
• Требования есть всегда –
формализованные или нет
• Из требований можно определить
характеристики параметра
• Для каждой характеристики выделяются
классы эквивалентности
12
14. Пример
"Логин должен состоять из латинских
символов, цифр, одинарного дефиса или
точки, начинаться с буквы и заканчиваться
буквой или цифрой и содержать не более
30 символов"
14
15. Пример
Характеристики для параметра “логин”
а) длина: не более 30 символов
б) первый символ: обязательно буква
в) последний символ: буква или цифра
г) содержащиеся символы: латинские
символы, цифры, одинарный дефис, точка.
15
16. Эвристические правила для
выделения КЭ
1) Если характеристика определена
диапазоном значений, то для нее
выделяется три класса эквивалентности:
• сам диапазон
• значения, лежащие слева от него
• значения, лежащие справа от него
16
17. Пример
длина: не более 30 символов
Классы эквивалентности:
• (- ∞, 0+,
• [1, 30],
• *31, + ∞)
1 30
17
18. Эвристические правила для
выделения КЭ
2) Если характеристика определена набором
валидных (неупорядоченных) данных, то
для нее выделяют два класса:
• первый, с набором валидных данных,
• второй, с набором невалидных.
18
19. Пример
содержащиеся символы: латинские
символы, цифры, одинарный дефис, точка
Классы эквивалентности:
• валидные символы = ,a,..z,A..Z,0,..9,-,.}
• невалидные символы = !,a,..z,A..Z,0,..9,-,.} –
т.е. все остальные, кроме валидных
19
20. Эвристические правила для
выделения КЭ
Если характеристика определяется
условием "must be", то выделяется два
класса эквивалентности:
• первый, выполняющий условие,
• второй – нет.
20
22. Доразбиение классов
– если полученный класс неоднороден, и
скорее всего имеет внутри себя скрытые
подклассы
Например, как:
!{A, .. Z, a,..,z}
22
23. Доразбиение классов
• по очевидным, хотя, возможно
несущественным различиям элементов
класса
• по т.н. user profile, т. е. данным, которые
чаще всего вводит пользователь вашей
системы
• произвольно разделив класс на подклассы
равного размера
23
24. Линейные и нелинейные КЭ
• Линейными называют КЭ, которые могут
быть представлены на числовой прямой,
или в виде упорядоченных множеств.
• Нелинейными — все остальные.
24
25. Истинные и ложные нелинейные КЭ
• Ложные: КЭ, про которые мы недостаточно
знаем
• Истинные: КЭ, которые определяются,
например, словарем значений, и
представляют собой класс вырожденных
подклассов
25
30. «Random Testing»
Случайным образом – выбирается одно
значение из класса наугад.
Тонкий нюанс: использовать ли на всех
последующих тестах одно и то же
значение?
30
31. Методы пропорционального
разбиения
- Что это?
- Логическое продолжение техники
«случайного выбора»
- Зачем это?
- Уменьшить риск неправильного
определения КЭ
31
32. Методы пропорционального
разбиения
1. Несколько случайных значений из класса.
Количество значений определяется
стоимостью дефекта.
2. Классы разбиваются на подклассы равного
размера. Из каждого выбирается по
одному значению
3. Выбирается некое число, определяющее
пропорцию количества выбранных
значений к размеру области.
32
33. Методы пропорционального
разбиения
Особенно хороши для нелинейных
классов эквивалентности –
истинных и ложных.
33
35. Анализ граничных значений
Самая известная и популярная техника:
[min-1, min+1], [max-1, max+1]
Предназначена для нахождения ошибок
границ.
35
36. Типовые ошибки границ
1. Ошибка закрытия
2. Сдвиг границы
3. Направление границы
4. Лишняя граница
5. Пропущенная граница
36
37. Что еще сказать про граничные
значения?
Канер просил помнить про:
- числовые границы
- границы множеств
- границы циклов
- границы структур данных
- границы пространства (многомерные
объекты)
- границы времени
- границы конфигураций
37
39. Пример
NextDate($some_date); – функция, которая
возвращает дату следующего дня.
Что здесь граничные значения, а что специальные?
- конец короткого месяца,
- конец длинного месяца,
- конец года,
- 28 февраля високосного/обычного года,
- 29 февраля високосного/обычного года,
- 31.12.1969
39
40. Специальные значения для КЭ
- исключения, дополнительные условные
операторы (дополнительные пути)
- вырожденные КЭ из одного элемента
внутри основного класса
40
41. Robustness Testing
Анализ границ выходных значений.
Пример: c=a/b;
где a, b, c – вещественные числа типа float.
а= max float, b= 0.1
c= (max float) / 0.1 = 10 * (max float) -
потенциальный дефект
41
42. Steeplechase Testing
Еще одна разновидность работы с
граничными значениями:
кроме границ, накладываемых бизнес-
требованиями, проверяем технические
границы
42
43. Worse-Case Testing
Сочетание невалидных граничных
значений нескольких переменных
Если P=f(A,B,C), то:
(min-1, min-1, min-1),
(min-1, min-1, max+1),
(min-1, max+1, max+1), и т д
43
45. Определения
Single-mode дефект – дефект, вызываемый
значением/значениями одного параметра
Double-mode дефект – дефект,
вызываемый значениями двух параметров
Multi-mode дефект – дефект, вызываемый
значениями трех и более параметров
45
46. Equivalence class testing
Неожиданно оказалось, что это целых
четыре техники:
- Weak Normal Equivalence Class Testing
- Strong Normal Equivalence Class Testing
- Weak Robust Equivalence Class Testing
- Strong Robust Equivalence Class Testing
46
47. Для иллюстрации
Пусть P = f (A, B, C).
A = {a1, a2, a3},
B = {b1, b2, b3, b4},
C = {c1, c2}
47
53. Минусы ECT
• чем больше параметров,
• чем больше классов для каждого из них
выделено,
• чем больше значений выбрано из каждого
класса –
тем быстрее мы получим слишком
большое количество тестов.
53
54. Первая попытка избежать
комбинаторного взрыва
Сочетать между собой только параметры
одной функции:
- используя здравый смысл,
- заглянув в черный ящик
54
55. Input-Output Analysis
Пусть есть P (A, B, C) , где
A = {a1, a2, a3},
B = {b1, b2, b3, b4},
C = {c1, c2}
и какие-то выходные значения Y и Z
Полный перебор даст нам 3*4*2 = 24 теста
55
59. Input-Output Analysis
Склеим два набора тестов:
(a1, b1, c1)
(a1, b2, c2)
(a2, b3, c1)
(a2, b4, c2)
(a3, b1, c1)
(a3, b2, c2)
Профит? 6 тестов вместо 24 без потери покрытия
59
60. Черный ящик такой черный
В: Если в ящик заглянуть невозможно?
О: Используйте автотесты не по
назначению
60
61. План спасения
- Автотесты + перебор всех возможных
входных значений
- Выходные значения: изменились или
нет?
..
Профит?
61
62. Профит и минусы
Профит: резко сокращаем количество
тестов при сохранении покрытия
Минусы: часто мы выделяем функции не
задумываясь, т. е. мы сталкиваемся с
проблемой комбинаторного взрыва, уже
применив эту технику
62
63. Вторая попытка избежать
комбинаторного взрыва
Тестов по-прежнему слишком много.
Выход: отказаться от части тестов, если это
возможно
63
64. Pairwise
Pairwise – не волшебный способ сократить
количество тестов магическим образом.
Это следующий шаг сокращения
количества тестов путем уменьшения
покрытия до single- и double-mode
дефектов.
64
65. Определение
Pairwise – техника тестирования, при
которой каждое значение каждого
параметра сочетается с каждым
значением каждого другого.
Т.е. тестирование всех пар значений
(покрытие double-mode дефектов)
65
67. Пример double-mode покрытия
«Все пары»:
a1 вместе с b1, b2, b3, b4, c1, c2
a2 вместе с b1, b2, b3, b4, c1, c2
a3 вместе с b1, b2, b3, b4, c1, c2
b1 вместе с c1, c2
b2 вместе с с1, с2
b3 вместе с с1, с2
b4 вместе с с1, с2
67
69. Плюсы Pairwise
Чем больше параметров – тем выгоднее
способ.
Известный пример:
• система из 75 бинарных значений
• полное количество тестов - 2^75
• 28 тестов для всех пар
69
70. Минусы Pairwise
- Много тестов в одном наборе данных
- Multi-mode дефекты при использовании
этого способа могут быть обнаружены
только случайно
- Нетривиальный способ проектирования
тестов
70
71. Если double-mode дефектов
недостаточно
- сочетать с другими методиками
- расширять тестовое покрытие на multi-
mode дефекты, используя метод
ортогональных массивов
71
72. Время для вопросов, замечаний
и помидоров
Марина Широчкина, pancakyes@ya.ru
72