Принципы тестирования — применение, искажения и иллюзии

Вместо пролога

Эта статья была начата ещё в апреле текущего (2020) года. И с тех пор я её несколько раз переписывал. Я никак не мог достичь того результата, который бы меня устроил. Я не хотел писать очередную статью про 7 принципов тестирования, куда бы просто скопипастились переводы этих принципов из ISTQB, а потом (как в лучших из статей) сопровождались разъяснениями на тему "Что это всё означает". Получилось бы очередное переписывание "священного писания" с его толкованием. Однако, поистине священное писание в толковании не нуждается.

Моя статья будет не про то, что же это за 7 столпов тестирования. Я специально опущу некоторые детали при объяснении принципов. Легким движением руки по клавиатуре вы сможете нагуглить всё это сами. Мы поговорим сразу о боли.

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

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

Немного о себе, прежде чем начать (эту часть можно пропустить)

Меня зовут Кирилл, я в ИТ с 2009 года, тестированием занимаюсь уже почти 10 лет. Сейчас я работаю на руководящей должности в QA, а так же помогаю в обучении начинающих тестировщиков и параллельно этому всему веду свой телеграм-канал для джуниоров QA (ссылочка будет в конце статьи)

Я не всегда руководствовался в жизни 7ю принципами тестирования. Более того, я не всегда даже знал о них (как и многие тестировщики, я думаю). Но, чем больше сила, тем больше и ответственность, как говаривал дядя Бен. И со временем до меня начал доходить смысл каждого принципа, а после я начал замечать как эти принципы трактуются, искажаются и видоизменяются под тяжестью корпоративных культур каждой отдельной компании.

Собственно семь принципов тестирования

  • Тестирование демонстрирует (только) наличие дефектов (Testing shows presence of defects)
  • Исчерпывающее тестирование недостижимо (Exhaustive testing is impossible)
  • Раннее тестирование (экономит время и деньги) (Early testing saves time and money)
  • Принцип скопления дефектов (Defect clustering)
  • Парадокс пестицида (Pesticide paradox)
  • Тестирование зависит от контекста (Testing is context dependent)
  • Заблуждение об отсутствии ошибок (Absence-of-errors fallacy)

Тестирование демонстрирует наличие дефектов

О чём принцип:

Тестирование может показать наличие дефектов в программе, но не доказать их отсутствие.

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

Но, коллеги, не забывайте, что иногда бизнес спрашивает "почему этот баг попал на продакшн?". На этот вопрос вы обязаны ответить вполне конкретно. У каждого конкретного бага есть причины появления/пропуска. Но давая ответ на вопрос, так же давайте понять бизнесу, что отсутствие найденных дефектов в процессе тестирования не гарантирует отсутствия ошибок в системе.

Исчерпывающее тестирование невозможно

О чём принцип:

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

Запомнили принцип выше? Отсутствие багов не гарантирует отсутствие ошибок, кажется, что второй принцип очевидно вытекает из первого, верно?

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

В мире ограниченных ресурсов и возможностей нужно уметь оценивать риски и расставлять приоритеты. Тестируя, мы снижаем риски. Делая правильный тест-дизайн, мы ещё сильнее снижаем риски. Так и живём.

Раннее тестирование экономит время и деньги

О чём принцип:

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

Это избитая истина, примерно такого же плана, как и "ПО надо тестировать, т.к. писать код без ошибок физически невозможно". Но многим руководителям кажется, что на самом деле тестирование отнимает время релизного цикла, т.к. задерживает доставку фич, а так же тратит время тестировщиков, на то, чтобы они читали "бумажки" вместо того, чтоб тестировать.

Я всю свою жизнь сталкиваюсь с этим удивительным противоречием; парадоксом, если угодно. Менеджеры говорят, что качество ПО превыше всего, недовольные клиенты — недопустимо, если надо тестировать, то мы выделим на это время. Но на деле почти всегда оказывается, что рук не хватает, бюджета нет и "давайте вы сейчас проверите, чтобы катнуть побыстрее, а потом уже будете свои тест-кейсы писать".

Кластеризация (или скопление) дефектов

О чём принцип:

Дефекты не размазаны равномерно по приложению, а сконцентрированы в больших количествах в некоторых модулях системы

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

Крайний случай (но справедливости ради замечу, что это не самый распространенный случай) - это "тест до первого бага". Причин тому может быть несколько: ленивый или некомпетентный тестировщик, или же метрики/kpi, которые поджимают тестировщика быстрее перекинуть мяч на сторону разработчиков.

Просто помните, если вы уже нашли несколько багов в каком-то модуле, стоит перелопатить его ещё тщательнее, скорее всего там есть ещё скрытые дефекты.

В то же время, отсутствие дефектов в других модулях не говорит, что дефектов там нет (помните первый принцип?)

Парадокс (эффект) пестицида

О чём принцип:

Это самый распиаренный принцип тестирования. Суть его в том, что если вы долго проводите одни и те же проверки, скорее всего новых багов вы не найдете. Именно поэтому периодически нужно "встряхивать" вашу тестовую базу, ревьюить её новыми сотрудниками и проводить исследовательское тестирование.

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

Тестирование зависит от контекста

О чём принцип:

Об этом я уже как-то упоминал в одной из предыдущих статей. Набор методологий и инструментов, а также подходов и ресурсов для тестирования зависит от того, что именно вы тестируете и на сколько объект тестирования важен

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

Тем не менее, многие прикрываются этим принципом со словами "Если у других методика работает - не значит, что и у нас будет". Это безусловно верно по-умолчанию. Но дело в том, что "чморение новой идеи" не доказывает, что выбранные сейчас подходы оптимальны для тестирования (так же как и доказательства вредности фаст-фуда не подтверждают полезность овощей).

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

Заблуждение об отсутствии ошибок

О чём принцип:

Тот факт, что тестирование не обнаружило дефектов, ещё не значит, что программа хорошая.

Ну вот снова! Хочется сорвать с себя шапку-ушанку и крикнуть: "Ай, да катись оно всё пропадом", раз никаких гарантий нет, то нафига вообще тестировать!? Ответ прост: чтобы снизить риски. Протестированный продукт с вероятностью 95% bug free, но не протестированный продукт с вероятностью 95% уйдет в продакшн с багами.

С учетом того, как этот принцип доносят на просторах интернета, легко спутать его с первым принципом. Многие забывают, что суть принципа: отсутствие дефектов - необходимое, но не достаточное условие хорошего ПО. Есть и другие факторы, влияющие на качество продукта. И вот о них-то как раз все забывают, считая, что лишь тестировщики и тестирование ответственны за качество.

Эпилог

Не могу сказать, что я всю свою сознательную QA жизнь только и вижу, как принципы тестирования нарушаются. Нет, ни в коем случае. Я просто подобрал для каждого принципа распространенные случаи игнорирования или иной трактовки. В том или ином виде, объёме, сознательно или нет, но часть принципов соблюдается почти всеми командами, в которых присутствует процесс тестирования ПО. Мне лишь хотелось подсветить некоторые моменты/признаки, по которым чуть легче пустить факт нарушения принципов в своё сознание.

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

Бонус

На просторах интернета я наткнулся ещё на парочку неофициальных доп.принципов, которые мне кажутся более понятными, приземленными и интуитивно полезными:

  • тестирование должно производиться независимыми специалистами;
  • тестируйте как позитивные, так и негативные сценарии;
  • не допускайте изменений в ПО в процессе тестирования;
  • указывайте ожидаемый результат выполнения тестов.

Но вот их я как раз разберу отдельным постом в своём телеграм-канале, так что если кому интересно - присоединяйтесь к @aboutqa

99
Начать дискуссию