среда, 6 ноября 2013 г.

Pairwise testing: добиваемся оптимального покрытия различных тестовых комбинаций

В тестировании программ очень часто встаёт задача проверки комбинаций входных параметров, от которых зависит итоговый результат программы. Типичный пример - диалоговое окно печати файла: оно имеет множество настроек, полей ввода, различных взаимозависимых опций, от включения или выключения которых итоговый результат может сильно различаться. Если бы даже все опции имели только два режима работы (вкл/выкл), а всего опций было бы 10, то это уже даёт 210 = 1024 их комбинаций.

Конечно, чтобы убедиться в работоспособности программы, в идеале нужно проверить все тестовые наборы, состоящие из всех возможных комбинаций параметров, так как для одной из них она может работать некорректно. Но, во-первых, таких тестовых наборов может получиться достаточно много и будет трудоёмко их все проверить. Во-вторых, при тестировании обычно желают получить не сочетания всех параметров со всеми, ведь в этом случае будет труднее локализовать дефект и воспроизвести проблему, а проверить отдельные пары значений параметров, которые могут привести к проблеме. Для упрощения подбора таких пар используют методику Pairwise testing, которая позволяет выделить комбинации уникальных пар проверяемых значений и одновременно уменьшить число тестовых наборов, по сравнению с полным перебором.


1. Вкратце о Pairwise testing


Pairwise testing (all-pairs analysis, попарное тестирование или попарный анализ, анализ всех пар комбинаций) - это современная и эффективная методика тестирования, основанная на том предположении, что большинство дефектов возникает при взаимодействии не более двух факторов. Тестовые наборы, генерируемые при использовании данной методики охватывают все уникальные пары комбинаций факторов, что считается достаточным для обнаружения большего числа дефектов.

О теории применения pairwise testing достаточно много и подробно написано в Интернете, поэтому далее кратко изложим лишь суть основных методов, и сразу перейдем к практическому примеру. С другими трактовками общей теории и практическими задачами можно ознакомиться, например, в следующий статьях:
  1. "Pairwise testing. Part 1 - Orthogonal Arrays" (ru) - вводная статья для ознакомления с примерами построения ортогональных массивов в целях тестирования.
  2. "Pairwise testing. Part 2 - AllPairs Algorithm" (ru) - продолжение предыдущей статьи, в которой объясняется суть алгоритма allpairs.
  3. "Pairwise Testing" (en) - подробная статья, в которой описан пример использования данной методики для выбора тестовых комбинаций из трёх параметров.
  4. "Pairwise Testing: A Best Practice That Isn’t" (en) - статья, в которой рассматриваются преимущества использования методики попарного тестирования перед другими.
  5. "Pairwise Testing in the Real World: Practical Extensions to Test-Case Scenarios" (en) - практикум от Микрософт по использованию методики Pairwise testing.
  6. "All-pairs testing" (en) - статья в Википедии с описанием комбинаторного метода, лежащего в основе попарного тестирования.
  7. "Метод попарного тестирования" (ru) - аналогичные примеры из области попарного тестирования, что и в источниках выше.
Для Pairwise тестирования используются алгоритмы основанные на построении ортогональных массивов или на All-Pairs алгоритме, которые опираются на теоретические исследования в области комбинаторных алгоритмов, алгоритмов дискретной математики и, в частности, латинских квадратов (см., например, М. Холл "Комбинаторика", М.: Мир, 1970, глава 13, стр. 261).

Ортогональный массив (ортогональная таблица) - это таблица Lm(kn), где m - число строк, n - число столбцов (по числу входных параметров), k - количество вариантов для значений элементов таблицы, и обладающая следующими свойствами:
  1. Любые два столбца таблицы содержат все комбинации значений этих столбцов.
  2. Если какая-либо пара значений двух столбцов встречается несколько раз, то все возможные парные комбинации значений этих столбцов должны встретиться столько же раз.
В ортогональных массивах необязательно все столбцы должны иметь одинаковое количество значений. Существуют так называемые смешанные (mixed) ортогональные массивы. Например:

L4(23) – ортогональный массив с четырьмя строками, тремя столбцами (по количеству переменных), 2 означает, что все переменные принимают только два значения – 1 и 2.

L18(2137– смешанный ортогональный массив с восемнадцатью строками, у которого один столбец со значениями 1 и 2, и семь столбцов со значениями 1, 2, 3.

Для тестирования с использованием ортогональных массивов выполняют следующие шаги:
  1. Определяют переменные для входных данных в комбинациях. Например, это могут быть названия опций, параметров настроек, допустимых конфигураций оборудования и т. п.
  2. Определяют значения, которые могут принимать переменные. Например, конкретные названия пунктов меню, числовые значения, названия операционных систем или баз данных и т. п.
  3. Строят ортогональный массив, который имеет столбец для каждой переменной. Обычно для этого используется какая-либо программа, например, STATISTICA.
  4. Каждая строка построенного массива интерпретируется как одна комбинация значений переменных для одного тестового случая.
All-Pairs Algorithm (алгоритм всех пар) - это комбинаторная методика, которая была специально создана для попарного тестирования. В её основе лежит выбор возможных комбинаций значений всех переменных, в которых содержатся все возможные значения для каждой пары переменных. Исходя из определения при этом будет получено меньшее число комбинаций, чем при использовании ортогональных массивов.

Для тестирования с использованием All-Pairs алгоритма выполняют следующие шаги:
  1. Аналогично, как для ортогональных массивов, определяют таблицу всех переменных и их значений.
  2. Оставляют в таблице только все возможные уникальные комбинации пар значений переменных.
Пример рассуждений по алгоритму All-Pairs, для выбора нужных строк с комбинациями, приведен под спойлером:

Обычно на практике используют некоторые программные реализации этого алгоритма, так как вручную перебирать все пары достаточно трудоёмко.


2. Программная реализация All-Pairs алгоритма для Pairwise testing


Существует множество инструментов для реализации техники попарного анализа, например, с их списком можно ознакомиться по ссылке:
http://www.pairwise.org/tools.asp

В нашей команде автоматизаторов при разработке одной из систем тестирования широко применялся Python. Поэтому рассмотрим здесь пример использования в своих скриптах генератора комбинаций AllPairs, разработанного MetaCommunications Engineering для Python и реализующего одноименную методику. Скачать его можно здесь: http://sourceforge.net/apps/trac/allpairs/

После стандартной установки библиотеки AllPairs можно скопировать к себе в проект каталог <PYTHON_HOME>\Lib\site-packages\metacomm\ для упрощения импортов и переноса проекта на другие компьютеры.

Рассмотрим ещё одну задачу из области тестирования. Пусть требуется проверить работоспособность веб-сайта в различных конфигурациях браузеров, операционных системах и на платформах с различной разрядностью. Например, заданы четыре конкретные операционные системы: Windows XP SP 3, Windows 7 SP 1, Debian 7.1, Ubuntu 12.04, для двух разрядностей: x86, x64, и три браузера: chrome, firefox, safari.

При этом получаем: 4 x 2 x 3 = 24 конфигурации для тестовых наборов, которые требуется проверить в общем случае. Можно уменьшить число тестовых наборов при помощи AllPairs.

Входные данные для модуля AllPairs могут быть заданы как список списков из строк, значения которых однозначно характеризуют параметры для тестовых наборов. Для нашей задачи это могут быть просто названия параметров для конфигураций:
список возможных ОС:Windows XP SP 3, Windows 7 SP 1, Debian 7.1, Ubuntu 12.04,
список разрядностей:x86, x64,
список браузеров:chrome, firefox, safari.

Задание входных параметров в Python-коде и использование AllPairs для построения их комбинаций может выглядеть как в спойлере ниже (предполагается, что каталог ext, содержащий пакет metacomm, уже лежит рядом со скриптом allpairs.py).

Код скрипта allpairs.py:

В скрипте каждая новая строка переменной inputData содержит список допустимых значений для отдельного параметра в тестируемых конфигурациях. После определения таким образом входных данных, нужно просто выполнить скрипт командой:
python allpairs.py

На выходе будет получен пронумерованный список строк вида:
Combination 0: ['Windows XP SP 3', 'x86', 'chrome'] ...
Как видим, комбинаций всего 12 - в два раза меньше, чем их полное число в общем случае. А если применить этот же алгоритм для примера в начале статьи, то вместо 1024 полных комбинаций, получим всего 8!


Затем полученные комбинации можно интерпретировать как тестовые случаи, например:
"Выполнить проверку работоспособности веб-сайта для конфигурации:
- ОС: Windows XP SP 3,
- разрядность системы: x86,
- браузер: chrome."

Скачать код скрипта allpairs.py для данной задачи можно по ссылке:
https://drive.google.com/file/d/0B-1rf8K04ZS5ZHJpdXRRd24zc0E/edit?usp=sharing
код на GitHub:
https://github.com/Tim55667757/AllPairs_example

Приложенный архив включает в себя каталог metacomm с библиотекой AllPairs, модуль allpairs.py с примером решения приведённой выше задачи и вывод результатов в файле output.txt.

Переопределяя в скрипте allpairs.py значение параметра inputData аналогичным образом, после его отработки можно получить оптимальные комбинации тестовых наборов для всех подобных задач. А с целью дальнейшей автоматизации тестирования можно использовать генерируемые данные, например, для запуска автотестов с нужными параметрами конфигурации.