пятница, 11 июня 2010 г.

Что такое Pairwise Testing, и с чем его едят

Не так давно (век живи - век учись) я наткнулась на понятие "pairwise testing" (переведу в лоб как "попарное тестирование", но лучше буду использовать английский термин), заинтересовалась и решила разобраться, что это такое. Достаточно быстро поняв, как работает данная э… техника, у меня сразу возникли вопросы по поводу причин и смысла её использования, найти ответы на которые на днях у меня наконец дошли руки. Обо всём этом я и решила написать (длинно, но короче не вышло :( ).


Сразу скажу, что к своей радости, большую часть информации по данной теме я почерпнула из статей Майкла Болтона  и Джеймса Баха в соавторстве с Патриком Шрёдером  К радости - потому что с одной стороны, это небезызвестные и значительные для меня люди по теме исследовательского тестирования. С другой же стороны - в свойственной (как мне кажется) для этих авторов манере, статьи не безусловно восхваляют, но пытаются трезво оценить данную технику, что для скептичной меня и моих вопросов было именно тем, что нужно.

1. Что же это такое

Раз уж я взялась писать о pairwise testing, то, видимо, надо попытаться объяснять, в чём состоит суть данной техники. Не уверена, что у меня получится объяснить понятно и корректно, но я всё-таки попробую  :)

Итак, pairwise testing - это техника формирования наборов тестовых данных. Сформулировать суть можно, например, вот так: формирование таких наборов данных, в которых каждое тестируемое значение каждого из проверяемых параметров хотя бы единожды сочетается с каждым тестируемым значением всех остальных проверяемых параметров. Выходит не слишком понятно (и не факт, что правильно), так что можно попробовать объяснять на примере :)

Допустим, какое-то значений (налог) для человека рассчитывается на основании его пола, возраста и наличия детей - получаем три входных параметра, для каждого из которых для тестов выбираем каким-то образом значения. Например: пол - мужской или женский; возраст - до 25, от 25 до 60, более 60; наличие детей - да или нет. Для проверки правильности расчётов можно, конечно, перебрать все комбинации значений всех параметров:

пол возраст дети
1 мужчина до 25 детей нет
2 женщина до 25 детей нет
3 мужчина 25-60 детей нет
4 женщина 25-60 детей нет
5 мужчина старше 60 детей нет
6 женщина старше 60 детей нет
7 мужчина до 25 дети есть
8 женщина до 25 дети есть
9 мужчина 25-60 дети есть
10 женщина 25-60 дети есть
11 мужчина старше 60 дети есть
12 женщина старше 60 дети есть

А можно решить, что нам не нужны сочетания значений всех параметров со всеми, а мы хотим только убедиться, что мы проверим все уникальные пары значений параметров. Т.е., например, с точки зрения параметров пола и возраста мы хотим убедиться, что мы точно проверим мужчину до 25, мужчину между 25 и 60, мужчину после 60, а также женщину до 25, женщину между 25 и 60, ну и женщину после 60. И точно так же для всех остальных пар параметров. И таким образом, мы можем получить гораздо меньше наборов значений (в них есть все пары значений, правда некоторые дважды):

пол возраст дети
1 мужчина до 25 детей нет
2 женщина до 25 дети есть
3 мужчина 25-60 дети есть
4 женщина 25-60 детей нет
5 мужчина старше 60 детей нет
6 женщина старше 60 дети есть

Такой подход примерно и составляет суть техники pairwise testing - мы не проверяем все сочетания всех значений, но проверяем все пары значений.

2. Что в этом хорошего

Когда ведут речь о pairwise testing, чаще всего сравнивают его именно с перебором всех возможных комбинаций значений, и одно из главных достоинств pairwise testing в том, что с его использованием получается гораздо меньшее количество тестовых наборов данных, чем при полном переборе, который во многих случаях просто невозможен.

Наверное, по приведённому выше примеру может показаться, что разница между этой техникой и перебором всех значений не так и велика. Но это только при таком незначительном количестве параметров и их значений, а чем их больше - тем значительнее разница. Допустим, если есть 50 параметров, каждый из которых может принимать 2 значения, то для полного перебора потребуется количество комбинаций равное 2 в степени 50, т.е. 1 125 899 906 842 624 :) А при использовании pairwise testing можно обойтись всего четырнадцатью комбинациями!

Кстати, составление нужных комбинаций данных - задачка часто не самая простая, но, к счастью, для её решения существует много инструментов, разного уровня качества и (бес)платности :)

3. Почему пары

Лично у меня при знакомстве с этой техникой сразу возник вопрос - а почему именно пары? Почему не тройки значений или не какое-либо "квартетное тестирование"? Есть ли у такого подхода, например, какое-либо математическое обоснование, либо это с потолка взято?

Мне удалось найти вот такое объяснение: когда-то, на основании кем-то выполненного анализа по каким-то реальным данным был сделан вывод о том, что причиной возникновения большинства ошибок являются либо отдельные значения, либо сочетания пар значений (источник тут). Это соображение судя по всему и легло в основу развития pairwise testing.

В принципе, обоснование более ли менее разумное, ведь какие-то исследования были проведены. Однако из такого объяснения также понятно, что правило это не однозначно верное и что справедливо оно будет далеко не для всех случаев. К тому же стоит задуматься и о понятии "большинство ошибок" :)

4. Как же и когда это (не) применять

Разумеется, технику эту надо применять именно в тех случаях, в которых это целесообразно.
Вот если, например, у нас просто есть формочка с каким-то количеством разных полей, данные из которых просто сохраняются в базу данных, то применение этой техники практически не имеет смысла, ведь данные не взаимодействуют друг с другом (хотя и могут быть нюансы, как эти данные сохраняются в базу)! А pairwise testing - это та техника, применять которую стоит именно в случае взаимодействующих значений (для невзаимодействующих - чаще всего достаточно просто отдельной проверки каждого из параметров).

Под взаимодействующими параметрами я понимаю в первую очередь те, которые влияют на результат не просто своими собственными отдельными значениями, но именно комбинациями друг с другом . Кстати, вот хороший пример взаимодействия - определение вариантов тестовой среды, например, из нескольких операционных систем, браузеров и разрешений монитора.

Итак, если параметры задачи взаимодействуют, то, казалось бы, тут pairwise testing и станет тем чудесным решением, которое и силы сэкономит, и полное тестирование обеспечит. Но конечно, эта техника обеспечивает достаточно высокое покрытие, но далеко не полное - если вдруг ошибка возникает при сочетании трёх, четырёх или более параметров, то pairwise testing может и не помочь (это уж как повезёт). По-хорошему, применению pairwise testing должен предшествовать анализ тестируемого приложения на предмет того, насколько тестирование именно сочетаний пар параметров является для него целесообразным.

В любом случае, если не сравнивать pairwise testing с исчерпывающим тестированием (exhaustive testing), то понятно, что даже применение этой техники достаточно трудоёмко. И в иных случаях, возможно, лучше протестировать несколько наборов наиболее часто используемых реальными пользователями данных, чем затратить массу усилий и протестировать множество сгенерированных наборов, в которые действительно популярные комбинации могут и не попасть.

5. Так что же я хотела сказать

Конечно, я назвала только пару-тройку, но есть большое количество соображений, которые стоит принять во внимание, принимая решение о применении техники pairwise testing - стоит хотя бы обратиться к упомянутым выше статьям (их вообще стоит почитать при наличии интереса к данной теме). А pairwise testing - это просто инструмент, который, как и прочие инструменты, требует использования с умом.

31 комментарий:

  1. Несколько добавлений к статье.
    1) Есть инструменты, которые умеют генерить комбинации по произвольному базисы (пары, тройки и тд).

    2) Тулы, которые не умееют генерить базируясь на условиях (а таких большинство) - можно выкинуть. Очень редко бывают задачи, в которых параметры или их значения надо попарно перемножать и все комбинации допустимы. Например если операционка != windows, тогда браузер != IE. Если так задать нельзя, то вы получите кучу мусора, а выкинуть уже сгенеренные неправильные комбинации нельзя, т.к. вы выкинете другие правильные сочитания параметров.

    3)Ищите инструмент, который умеет использовать предписаные сочетания. Есть комбинации параметров и их значений, которые либо наиболее вероятны, либо наиболее важны для проверки (известные конфигурации у клиентов, например). Их хочется проверять, но наврядли тул так удачно все сгенерит.

    4) Перед пименением этого метода, надо обязательно воспользоваться другими методами, такими как разбиение на класы эквивалентности.

    5) Есть параметры на которые перемножать не надо. У нас например, это encoding. Если все умножать на encoding, то количество комбинаций резко возрастет, а толку от них нет. Поэтому такой параметр просто добавляется к уже сгнеренным комбинациям, не увеличивая их числа.

    ОтветитьУдалить
  2. Алексей, спасибо - очень полезные дополнения, особенно для применения pairwise testing на практике.

    Правда для себя я эту технику пока только взяла на вооружение - не вижу пока текущих задач, для которых её целесообразно было бы применить. Наиболее подходящей кажется задача определения тестового окружения, но в моём случае - это только сочетание ОС+браузер, а при двух параметрах pairwise testing - это по сути то же самое, что и полный перебор :)

    Кстати, если предположить, что то же тестовое окружение складывается из более чем двух параметров, то да - кажется, и стоит применить pairwise testing, чтобы упростить себе задачу, но я для себя никак не могу решить, насколько корректно будет в данном случае отталкиваться именно от пар параметров - наверное, в каждом конкретном случае от конкретных параметров зависит?..

    ОтветитьУдалить
  3. Спасибо, очень полезная статья!

    ОтветитьУдалить
  4. Рада, если статья оказалась полезной :)

    ОтветитьУдалить
  5. Я познакомился с "pairwise" когда искал тул для "автоматической генерации тестов" на основании комбинации входных параметров.
    Но увы, сама идея хоть и красивая, но на практике утопичная (LeshaL описал некоторые причины). Возможно для некоторых случаев и будет польза от таких генераторов (с применением средств автоматизации тестирования).
    Но на практике тестировщику никак не уйти от ручного выбора комбинаций входніх параметров и задания очерёдности их прогона.

    ОтветитьУдалить
  6. В одном из комментариев я писала, что тоже пока не вижу текущих задач, к которым эту технику можно применить. Но мне всё-таки кажется, что идея не утопичная - а просто это идея для каких-то своих подходящих задач :)

    ОтветитьУдалить
  7. Спасибо за статью, применил на работе - очень помогла !!!

    ОтветитьУдалить
  8. Очень рада узнать, что статья принесла пользу :)

    ОтветитьУдалить
  9. Ссылка на источник с математическим обоснованием битая (

    ОтветитьУдалить
    Ответы
    1. Да, действительно, ссылка больше не рабочая :( А найти сейчас аналог не получается, увы... Постараюсь проверить дома, может у меня сохранённая копия осталась, но что-то сомневаюсь...

      Удалить
  10. Ссылка на статью битая, но материал хранится в webcache.googleusercontent http://webcache.googleusercontent.com/search?q=cache:AgrY0jmraQYJ:www.mcs.csueastbay.edu/~billard/se/cs4320/ex10/README+&cd=1&hl=ru&ct=clnk&gl=ru

    ОтветитьУдалить
    Ответы
    1. К сожалению, это не тот материал - он только ссылается на нужную страничку (см. "a. Introduction": http://www.argreenhouse.com/papers/gcp/AETGissre96.shtml).

      Удалить
  11. Спасибо! спрашивают на собесах.

    ОтветитьУдалить
    Ответы
    1. Вот уж никак не ожидала, что моя заметка для собеседований кому-то полезной будет... :) Но в любом случае рада, если пригодилось!

      Удалить
  12. Написано для людей, сразу стало понятно. Чотка!

    ОтветитьУдалить
    Ответы
    1. Хоть и запоздалое, но спасибо на добром слове :-)

      Удалить
  13. Полезно, спасибо! Пригодилось при выполнении дз для начального понимания сути метода :)

    ОтветитьУдалить
    Ответы
    1. Очень рада, что пригодилось! Успехов вам! :)

      Удалить
  14. Спасибо, познавательно :)

    ОтветитьУдалить
    Ответы
    1. Спасибо на добром слове :) Успехов вам!

      Удалить
  15. Ответы
    1. Ой, пропустила... Вам спасибо за внимание. Рада, если пригодилось!!

      Удалить
  16. спасибо за статью! думал о том как бы протестировать фильтр отображения новостей и pairwise тестирование подходит как нельзя лучше, чтобы перебрать БОЛЬШИНСТВО вариантов не перебирая все.

    ОтветитьУдалить
    Ответы
    1. :) Рада, если статья пригодилась, спасибо на добром слове! И успехов вам!

      Удалить
  17. Неплохая статья, вы очень сильно мне помогли

    ОтветитьУдалить