Хотя популярность buzzword «pairwise» уже не та, на собеседованиях до сих пор задают вопрос о том, что представляет собой эта техника тест-дизайна. Однако, далеко не все тестировщики (как те, кто приходят на собеседование, так и те, кто его проводят) могут четко сформулировать ответ на вопрос, зачем нужны комбинаторные техники в общем и pairwise в частности (подавляющее большинство ошибок, все же, находятся на атомарных значениях параметров и не зависят от других). Простой ответ на этот вопрос, на мой взгляд — для нахождения багов, возникающих вследствие явных и неявных зависимостей между параметрами. Для простых случаев техника вряд ли принесет серьезную пользу, поскольку их можно проверить вручную, а для большого числа параметров и сложных зависимостей между ними количество тестов, скорее всего, будет слишком велико для ручного тестирования. Потому основное применение комбинаторных техник (и соответственно, инструментов, осуществляющих генерацию комбинаций параметров) — автоматизированное составление наборов тестовых данных по определенным законам.
Большинство инструментов для генерации комбинаторных тестов умеют выдавать результат в виде файла с данными, который может быть передан на вход соответствующим автотестам. Такой пример (используется инструмент PICT) и будет рассмотрен ниже.
При условии использования автоматизированного тестирования для серии и номера паспорта можно составить исчерпывающий набор позитивных тестов, поскольку требования к этому полю строги — ровно две заглавных буквы украинского алфавита (кроме Ґ, Ї, Ь) и шесть цифр от 0 до 9. Всего таких тестов будет (33-3)2*106 = 9*108. Однако, редко встречаются случаи, когда требования к полю настолько строгие, да и вряд ли нужно проводить исчерпывающее тестирование. Скорее всего, достаточно проверить возможность ввода каждой отдельной буквы и каждой отдельной цифры на каждой позиции соответственно. Задачу составления таких тестов вполне может решить инструмент комбинаторного тестирования:
Аналогично можно составить негативные тесты (PICT позволяет пометить их специальным символом "~").
Из этих файлов потом можно будет читать построчно (разделитель — знак табуляции) и заполнять поля в приложении.
Иногда баги, связанные с валидациями, зависят от того, каким образом пользователь вводит невалидные данные: с клавиатуры (физической или экранной), с помощью контекстного меню копирования-вставки, горячих клавиш, перетаскивания выделенного текста. Например, часто перетаскивание текста не обрабатывается клиентской валидацией, если таким образом вводятся некорректные данные. Способ ввода можно ввести в модель в качестве дополнительного параметра и учесть его при составлении автотестов.
Для систем принятия решений иногда составляются исчерпывающие тестовые наборы, которые потом можно использовать не только для тестирования, но и для валидации требований. Применяя последовательно правила системы к каждому тесту, можно посмотреть, не получаются ли противоречивые результаты.
Валидация требований — очень немаловажная часть тестирования в данном случае, поскольку можно обнаружить скрытые противоречия. Инструмент генерации комбинаторных тестов позволит не только составить тесты, но и задать условия, накладываемые на входные данные. Если эти условия делают какие-то из возможных данных недостижимыми, инструмент укажет на это, что может послужить сигналом тщательной проверки требований на непротиворечивость.
В данной модели есть противоречивые требования, которые отсекают значение WORK: >=11, и оно не появляется ни в одном из тестов. К сожалению, инструмент не дает ответа на вопрос, какие именно условия вызывают противоречие, только показывает, какое значение исключено из тестов. Однако, этой информации может быть достаточно, чтобы выделить из всего массива ограничений те, что влияют на этот параметр, и проанализировать их на предмет противоречивости.
Исчерпывающий набор тестов в дальнейшем может быть использован для техники тест-дизайна «причина-следствие».
Инструменты для комбинаторного тестирования позволяют также составлять список возможных конфигураций, который потом можно отсортировать по популярности использования, вычеркнуть неподходящие и т.д. Если не обязательно проводить все тесты для каждой из конфигураций, можно поделить их равномерно между выбранными окружениями, добавив окружение в качестве еще одного параметра для генерации тестовых данных (так, как это делалось в примере со способом ввода данных).
Безусловно, комбинаторное тестирование можно применять и для генерации тестов, которые выполняются вручную, но как мне кажется, это стоит делать, только если есть очень большое количество ограничений, которые трудно удержать в голове. Из-за наличия условий количество тестов может быть ограничено, так сказать, естественным образом, и инструмент позволит получить все возможные тестовые данные, подходящие под все накладываемые на них условия. При этом тесты можно выполнить и вручную.
Большинство инструментов для генерации комбинаторных тестов умеют выдавать результат в виде файла с данными, который может быть передан на вход соответствующим автотестам. Такой пример (используется инструмент PICT) и будет рассмотрен ниже.
Пример 1. Серия и номер паспорта
При условии использования автоматизированного тестирования для серии и номера паспорта можно составить исчерпывающий набор позитивных тестов, поскольку требования к этому полю строги — ровно две заглавных буквы украинского алфавита (кроме Ґ, Ї, Ь) и шесть цифр от 0 до 9. Всего таких тестов будет (33-3)2*106 = 9*108. Однако, редко встречаются случаи, когда требования к полю настолько строгие, да и вряд ли нужно проводить исчерпывающее тестирование. Скорее всего, достаточно проверить возможность ввода каждой отдельной буквы и каждой отдельной цифры на каждой позиции соответственно. Задачу составления таких тестов вполне может решить инструмент комбинаторного тестирования:
SERIES_1: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
SERIES_2: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
NUMBER_1: 0,1,2,3,4,5,6,7,8,9
NUMBER_2: 0,1,2,3,4,5,6,7,8,9
NUMBER_3: 0,1,2,3,4,5,6,7,8,9
NUMBER_4: 0,1,2,3,4,5,6,7,8,9
NUMBER_5: 0,1,2,3,4,5,6,7,8,9
NUMBER_6: 0,1,2,3,4,5,6,7,8,9
{SERIES_1, SERIES_2, NUMBER_1, NUMBER_2, NUMBER_3, NUMBER_4, NUMBER_5, NUMBER_6} @ 1
Модель 1Щ З 4 6 3 1 1 5
І Є 8 3 8 9 9 3
А Н 3 0 5 8 6 2
М С 4 3 4 1 3 1
Є Я 4 6 7 3 1 4
Г Ц 0 2 4 5 2 0
Часть результатов моделированияАналогично можно составить негативные тесты (PICT позволяет пометить их специальным символом "~").
SERIES_1: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
SERIES_2: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
NUMBER_1: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
NUMBER_2: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
NUMBER_3: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
NUMBER_4: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
NUMBER_5: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
NUMBER_6: 0,1,2,3,4,5,6,7,8,9,~A,~B,~C,~D,~E,~F
Модель 2З У 1 3 7 2 7 4
Л Ю ~B 7 3 2 7 9
А Є 8 8 2 0 ~A 8
Часть результатов моделированияИз этих файлов потом можно будет читать построчно (разделитель — знак табуляции) и заполнять поля в приложении.
Пример 2. Увеличение тестового покрытия с помощью дополнительного параметра
Иногда баги, связанные с валидациями, зависят от того, каким образом пользователь вводит невалидные данные: с клавиатуры (физической или экранной), с помощью контекстного меню копирования-вставки, горячих клавиш, перетаскивания выделенного текста. Например, часто перетаскивание текста не обрабатывается клиентской валидацией, если таким образом вводятся некорректные данные. Способ ввода можно ввести в модель в качестве дополнительного параметра и учесть его при составлении автотестов.
SERIES_1: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
SERIES_2: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
NUMBER_1: 0,1,2,3,4,5,6,7,8,9
NUMBER_2: 0,1,2,3,4,5,6,7,8,9
NUMBER_3: 0,1,2,3,4,5,6,7,8,9
NUMBER_4: 0,1,2,3,4,5,6,7,8,9
NUMBER_5: 0,1,2,3,4,5,6,7,8,9
NUMBER_6: 0,1,2,3,4,5,6,7,8,9
INPUT: keyboard, screen keys, context menu, copy paste, drag-n-drop
Модель 3М Л 0 8 0 8 5 9 keyboard
Ю У 0 0 2 3 2 2 drag-n-drop
С Ч 5 3 6 2 1 0 screen keys
Я Д 3 9 4 1 6 7 context menu
У Ш 9 9 0 7 4 4 copy paste
Часть результатов моделированияПример 3. Тесты для систем принятия решений, валидация требований
Для систем принятия решений иногда составляются исчерпывающие тестовые наборы, которые потом можно использовать не только для тестирования, но и для валидации требований. Применяя последовательно правила системы к каждому тесту, можно посмотреть, не получаются ли противоречивые результаты.
Валидация требований — очень немаловажная часть тестирования в данном случае, поскольку можно обнаружить скрытые противоречия. Инструмент генерации комбинаторных тестов позволит не только составить тесты, но и задать условия, накладываемые на входные данные. Если эти условия делают какие-то из возможных данных недостижимыми, инструмент укажет на это, что может послужить сигналом тщательной проверки требований на непротиворечивость.
AGE: 0-17, 18-21, 22-65, >=66
CHILDREN: Y, N
SMOKING: Y, N
WORK: 0-5, 6-10, >=11
{AGE, CHILDREN, SMOKING, WORK} @ 4
IF [AGE] = "0-17" THEN [WORK] <> ">=11";
IF [WORK] =">=11" THEN [AGE] = "0-17";
Модель 4Constraints Warning: Restrictive constraints. Output will not contain following values
WORK: >=11
Реакция инструмента на противоречивые требованияВ данной модели есть противоречивые требования, которые отсекают значение WORK: >=11, и оно не появляется ни в одном из тестов. К сожалению, инструмент не дает ответа на вопрос, какие именно условия вызывают противоречие, только показывает, какое значение исключено из тестов. Однако, этой информации может быть достаточно, чтобы выделить из всего массива ограничений те, что влияют на этот параметр, и проанализировать их на предмет противоречивости.
Исчерпывающий набор тестов в дальнейшем может быть использован для техники тест-дизайна «причина-следствие».
Пример 4. Формирование параметров окружений для конфигурационного тестирования
Инструменты для комбинаторного тестирования позволяют также составлять список возможных конфигураций, который потом можно отсортировать по популярности использования, вычеркнуть неподходящие и т.д. Если не обязательно проводить все тесты для каждой из конфигураций, можно поделить их равномерно между выбранными окружениями, добавив окружение в качестве еще одного параметра для генерации тестовых данных (так, как это делалось в примере со способом ввода данных).
BROWSER: IE, Firefox, Chrome, Opera
LANG: en, ru, ua
OS: win, linux, android
{BROWSER, LANG, OS} @ 1
IF [OS] = "linux" THEN [BROWSER] <> "IE";
Модель 5IE ua win
Firefox en win
Opera ua linux
Chrome ru android
Результаты моделированияSERIES_1: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
SERIES_2: А,Б,В,Г,Д,Е,Є,Ж,З,І,Й,К,Л,М,Н,О,П,Р,С,Т,У,Ф,Х,Ц,Ч,Ш,Щ,Ю,Я
NUMBER_1: 0,1,2,3,4,5,6,7,8,9
NUMBER_2: 0,1,2,3,4,5,6,7,8,9
NUMBER_3: 0,1,2,3,4,5,6,7,8,9
NUMBER_4: 0,1,2,3,4,5,6,7,8,9
NUMBER_5: 0,1,2,3,4,5,6,7,8,9
NUMBER_6: 0,1,2,3,4,5,6,7,8,9
ENVIRONMENT: IE ua win, Firefox en win, Opera ua linux, Chrome ru android
Модель 6Пример 5. Составление нескольких тестов с учетом большого количества ограничений
Безусловно, комбинаторное тестирование можно применять и для генерации тестов, которые выполняются вручную, но как мне кажется, это стоит делать, только если есть очень большое количество ограничений, которые трудно удержать в голове. Из-за наличия условий количество тестов может быть ограничено, так сказать, естественным образом, и инструмент позволит получить все возможные тестовые данные, подходящие под все накладываемые на них условия. При этом тесты можно выполнить и вручную.
AGE: 0-17, 18-21, 22-65, >=66
CHILDREN: 0, 1, 2, 3, 4, 5
SMOKING: Y, N
WORK: 0-5, 6-10, >=11
IF [AGE] = "0-17" THEN [WORK] <> ">=11";
IF [AGE] = "0-17" THEN [CHILDREN] = 0;
IF [AGE] = "18-21" THEN [CHILDREN] < 2;
IF [CHILDREN] > 0 THEN [SMOKING] = "N";
IF [AGE] = ">=66" THEN [WORK] <> "0-5";
IF [AGE] = "0-17" OR [AGE] = "18-21" THEN [WORK] = "0-5";
Модель 622-65 2 N 0-5
18-21 1 N 0-5
>=66 2 N 6-10
22-65 4 N 6-10
22-65 5 N 6-10
22-65 3 N 6-10
>=66 4 N >=11
22-65 5 N >=11
0-17 0 Y 0-5
>=66 3 N >=11
22-65 4 N 0-5
22-65 2 N >=11
18-21 0 Y 0-5
22-65 0 Y >=11
22-65 1 N 6-10
22-65 3 N 0-5
>=66 1 N >=11
0-17 0 N 0-5
>=66 0 Y 6-10
>=66 5 N >=11
22-65 5 N 0-5
Результаты моделирования — 21 тест