История одного pairwise или как заменить мозги Гуглом и проиграть

Меня попросили придумать задачку "на подумать" без элементов автоматизации для тестировщиков.

Не вопрос, подумал я и быстро накидал условие. Решив задачку прямо на мобильнике за 2 минуты, я удовлетворённо поделился ей в группах Telegram.

Условие задачи.

Программа может быть проинсталлирована на 3 операционные системы. Каждая ОС имеет 3 версии. Каждая версия доступна на 4 языках.
Программа доступна в 2 версиях - демо и полная. Каждая инсталляция длится 5 минут, для смоук теста нужно ещё 10 минут.
Один тестировщик может выполнять ручное тестирование, ему доступно неограниченное количество систем со всеми нужными языками и ОС.

Сколько времени нужно запланировать на тестирование?

Любителям поломать голову рекомендую перед тем как читать дальше, попробовать решить задачу самостоятельно.

О задаче

Идея задачи проста и прямолинейна. Каждый тест длится 15 минут, параллелизация или автоматизация невозможны. Нужно тестировать комбинации одна за другой. В случае, когда полное количество комбинаций для тестирования велико, квалифицированный тестировщик может воспользоваться известным методом тест-дизайна, который позволяет значительно сократить количество комбинаций, при незначительной потери "надёжности" проверки.

Задачка была призвана проверить, знаком ли решатель с данной техникой, узнает ли он область её применения и сможет ли верно применить её на практике.

Метод называется Pairwise Testing, документирован несколько десятков лет назад. О нём рассказывают на большинстве общих advanced курсов тестирования, а иногда даже и на начальных.

Суть метода

Количество всех возможные комбинаций параметров быстро растёт с увеличением числа параметров и считается, как произведение количества значений каждого из параметров. То есть, если у нас есть 5 параметров (например - версия системы, язык и тд), с вариантами значений 5,4,2,2,2 - то полное количество комбинаций - 5*4*2*2*2=120.

Pairswise выбирает из всех возможных комбинаций подмножество, в котором каждая пара параметров встречается как минимум в одном тесте. Другими словами - любые два значения разных параметров будут учтены в тестах. Например, если у нас есть

  • MacOS, Windows, Linux (параметр 1)
  • испанский, японский, русский и английский (параметр 2)
  • версия программы демо и полная (параметр 3)

то любые два например:

  • Windows и японский
  • Linux и японский
  • демо и японский
  • полная и MacOS
  • и т.д. и т.п.

будут протестированы, а вот если взять три - например Windows, японский и демо - то уже не факт.

Математически доказано, что при предположении, что источники багов равномерно распределены по коду и набору параметров, то количество комбинаций уменьшается сильно, а покрытие кода нет. Учёные написали на эту тему много букв, а я (tldr;) просто предположу, что если мы потратим только 30% времени и энергии, достигнув при этом 95% результата, то наверное это хорошо.

Естественно, модель, как и все модели - только модель и не описывает идеально абсолютно все случае. Например баги могут быть неравномерно распределены, и вы мозжечком чувствуете, что самые большие проблемы будут с японским. Или что ваш софт запускает ракету с лекарством от рака в космос, и 5 непокрытых процентов могут выйти очень боком. И так далее. Но эта модель, как и все модели - помогает в среднем по больнице сделать тестирование значительно эффективнее. Задачки в Телеграме у нас тоже модельные, поэтому остаётся только применить модельную технику на модельную задачку. Что же может пойти не так?

Вычисления

Алгоритм вычисления пар по методу нетривиален, более того - существуют разные алгоритмы. Но для этого же и существует web и open source! Написаны сотни тулов помогающих решить это сложную задачу, берём и пользуемся.

Моё 2-минутное решения выглядело так.

  1. Гуглим онлайн-тул для Pairwise
  2. Вводим там наши данные
  3. Читаем количество комбинаций
  4. Умножаем на 15 минут (5+10, длительность теста) - это результат
  5. Профит

Если вы дочитали до этого места (риспект!), считаете, что вам всё понятно и задачка решается тривиально - это второе место, где можно попробовать сделать это самостоятельно. Спорим, к правильному результату вы не придёте!

Практика Pairwise

Предлагаю просто вместе пройти по алгоритму выше. Такой результат вы получили бы сегодня, 2 марта 2019 года.

Шаг 1. Гуглим Pairwise testing online.
Первая ссылка и - сразу же попадание. Следующие ссылки - общая страница про Pairwise, две страницы со списком тулов и Hexawise - по состоянию на сегодня без бесплатной версии.

Шаг 2. Вводим данные в тул. Хочу отметить понятный и интуитивный интерфейс, никаких проблем тут не возникло. Данные (на сегодня) доступны тут (permalink)

Шаг 3. Генерируем результат и считаем количество комбинаций. Красивой подсказкой на экране появляется 16 из 72 (полное количество: 3*3*4*2=72)

Шаг 4. Быстро подсчитываем итог 16*15 минут - 4 часа. Ответ 4 часа?

Проверка

Раскроем эксельку с комбинациями, сгенерированными программой.

Всё чисто? Увы, нет. Что это за пустые значения в таблице? Для каждого теста мне нужна комбинация из 4 значений, а не из двух или из трёх. Возможно программа добавила "пусто" как допустимое значение, но почему же тогда вышло 72 комбинации? При использовании пустого значения в колонках 1,2,4 количество комбинаций увеличилось бы до 4*4*4*3=192. Да и сам сайт правильно экспортирует список:

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

Вывод - 1

Внезапно оказалось, что первая ссылка находит подходящий удобный тул для, с буквально единственным недостатком - он работает неправильно. Или

Не все инструменты золото, что в топе выдачи Гугла.

Продолжение

Конечно я не собирался на этом останавливаться и продолжил поиски хорошего решения. Один из ответов присланных мне в чате содержал простую формулу: "умножаем две бОльшие категории друг на друга (3*4) и получаем ответ - 12 комбинаций, или 3 часа". Неожиданно просто. Как так?

Откроем Википедию на странице All-pairs Testing (состояние на сегодня). В примере, довольно похожим на наш, указывается "перемножаем два максимальных значения ...". Больше никаких комментариев не дано.

Значит ли это, что мы можем в любой задаче найти количество комбинаций простым перемножением количества значений в двух наибольших категориях между собой? Разумеется, нет. Простой контр-пример: попробуйте сгенерировать кейс с учётом всех пар, если у вас 6 категорий по 2 значения. У вас не получится уложиться в 4 (2*2) кейса.

Перемножать две категорий тем не менее, имеет практический смысл - полученное число, это нижняя граница (не всегда досягаемая) того, что может вычислить лучший в мире алгоритм. То есть в нашем исходном примере ответ меньше 12 комбинаций не может получиться никак, и если инструмент посчитаем вам 10 - значит вероятно где-то вы ошиблись с вводом данных.

Вывод - 2

Не все формулы, что написаны в Wikipedia верны

Надёжный инструмент

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

В результате я получил от Алексея Баранцева рекомендацию попробовать command-line tool для Windows PICT, написанный в Microsoft и выложенный в open source. Спасибо Алексею за существенную помощь в понимании pairwise!

Сказано-сделано. Скачал, приготовил файл с моделью, запустил.

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

PICT

PICT не требует установки, просто скачали pict.exe и мы готовы к экспериментам!

Файл модели имеет простой формат:

Запускаем pict! Параметр /s выводит только количество, а запуск без параметров - набор комбинаций.

Готово! Итак, всего у нас 13 комбинаций? Не так быстро! В ответ на мою задачку я получил сразу несколько решений с использованием PICT, причём ответы разнились. Разные скриншоты показывали от 12 до 15 комбинаций. В чём же дело? Генератор который использует PICT использует генератор случайных чисел, а кроме того, результат сильно зависит от порядка задаваемых элементов. Последний факт я узнал от Алексея, в документации к инструменту я этой информации не нашел.

Окей, можно ли считать любой результат сгенерированный по правилам верным решением нашей задачи? Я считаю, что нет. Ведь лишние тест-кейсы приводят к лишним затратам ресурсов. Если 12 тест-кейсов покрывают все пары, то зачем запускать 15? Как же отсортировать параметры, чтобы получить минимальное значение? Давайте спросим Гугл!

Порядок входных данных

Ввёл pairwise testing sort input. Первая ссылка

Быстро находим нужную нам часть.

"Теперь поменяем порядок так, что категории с наибольшим количеством значений будут впереди, а с наименьшем позади".

Кажется, всё понятно?

Не буду мучать ваш лишними скриншотами, но поверьте, что если вы отсортируете данные для PICT по этому рецепту, то получите ответ 15, то есть наихудшее из возможных значений. Лучший ответ - 12 получается, если использовать обратный порядок - меньшие категории сначала, большие - в конце.

Вот пруфы:

Все последнем скриншоте можно убедиться, что все возможные пары присутствуют, а значит и ответ - 12 пар или 3 часа тестирования.

Вывод - 3

Нельзя просто взять и использовать совет из верхней ссылки найденой в Гугле

Разбор полёта

Ну теперь то всё, задачка решена, скажете вы? Не угадали. Самые внимательные наверное уже обратили внимание на то, что я ненамеренно допустил чудовищную ошибку в формулировке задачи. Практически все измышление описанные выше просто неверны. Любопытствующие могут внимательно перечитать условие и окончательный ответ, чтобы найти проблему.

Для остальных просто расскажу в чем дело.

В формулировке задачи написано, что каждая версия ОС имеет 3 версии, которые мы на скорую руку обозначили v1, v2, v3. Но очевидно, что к примеру, v3 для Windows и v3 для MacOS - это абсолютно разные, не имеющие ничего общего версии (сравни Windows 7, Windows 8, Windows 10 и MacOS Lion, MacOS High Sierra, MacOS Mojave). Модель категории версии была выбрана неправильно, и на самом деле мы имеем только 3 категории, в первой 9 различных ОС, и далее язык и версия программы. В таком случае количество полных вариантов остаётся прежним 72, а pairwise становиться скучным и считаемым даже в уме. Минимальное количество (перемножаем две наибольшие категории) 9*4=36 является оптимальным и элементарно достижимым. Соответственно правильный ответ задачи, внезапно - 9 часов.

Вернуть задумку не испортив задачку довольно легко, можно вместо 3 версий ОС определить, например, 3 категории размера экрана монитора M, L и XL. Тогда приведённые выше рассуждения будут корректны, и задуманный ответ - 3 часа будет оспорить непросто.

Заключение

Данная задачка и разбор наглядно показывают проблемы современных методов поиска информации (гуглить), если при их использовании выключать мозг и всё принимать на веру.

И еще раз, это задачка по "мануальному тестированию". Вы все ещё считаете, что работа ручного тестировщика проста и монотонна?