Управление Тестированием В Testops: Храните Информацию, А Не Выводы

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

«Дерево» уже давно выиграло эту гонку.

Структуры папок в операционных системах знакомы всем, и исторически простое дерево в UI/UX становится первым решением для организации и хранения данных.

Сегодня мы поговорим о тестировании, поэтому в нашем случае объектами хранения будут тест-кейсы.

Как их чаще всего хранят? Правильно, в папочки! Это обычное дело? Да.

Но является ли это решение хорошим и универсальным? Вопрос подтверждается наличием исключений: почта, билеты JIRA и многое другое не хранятся в папках.

Давайте разберемся, почему.



Одиночное дерево

Такой подход позволяет быстро приступить к работе и смоделировать структуру построения тестовой базы.

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

Управление тестированием в TestOps: храните информацию, а не выводы

В результате получается красивое решение, позволяющее команде тестирования спокойно и системно, с разделением зон ответственности, наполнять дерево тестами.

Однако, если бы все было хорошо, такой ситуации бы не возникло.



Что случилось с ним?

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

Однако в какой-то момент к QA-менеджеру (а они всегда приходят!) приходит менеджер и просит рассказать о тестовом покрытии микросервисов.

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

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

В результате общее дерево в конечном итоге делится на поддеревья: у каждой команды есть свое поддерево со своими правилами.

Если необходимо добавить в тесты дополнительную фичу, никто не пойдет редактировать чужие поддеревья: неудобно, это не нужно, процессы уже привязаны к текущей структуре, нет времени этим заниматься, «не надо».

потрогайте наши тесты!» и по миллиону других причин.

В результате получается картинка, где дерево папок общее, но каждое поддерево имеет свои уровни.

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

По мере роста проекта и возникновения требований к прозрачности тестирования возникает второе ограничение структуры папок: ее очень сложно поддерживать.

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

Для этого нужно спроектировать новую структуру, вместе с аналитиком (если он у вас есть) разобраться в особенностях и аккуратно перенести все тесты в новую структуру.

Выглядит просто, но такой процесс в крупных проектах занимает недели и месяцы, и те, кто с этим еще не сталкивался, — счастливые люди.



Управление тестированием в TestOps: храните информацию, а не выводы

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

Если вы попытаетесь создать структуру сразу с двумя разделами, функциями и компонентами, ее сложность и запутанность создаст больше проблем, чем того стоит. Что, если у вас есть 3000 тестовых случаев? А если 10 000? Однако, чтобы столкнуться с ограничениями структуры папок хранения тестов, не обязательно ждать от менеджера какого-то «хитрого» запроса.

Если вам нужно найти самый «красный» компонент в недавно переработанной структуре признаков, вы, скорее всего, не сможете этого сделать: вы найдете самого красного «папу» с признаком, но сразу не будет понятно, какие компоненты являются в нем проходят испытания.

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

Еще один подводный камень хранения тестов в папках ждет тех, кто планирует хранить в них автоматизированные тесты, написанные на разных языках программирования.

Здесь все просто: в Java тесты хранятся по полному имени пакета типа io.qameta.allure, а в JavaScript или Python — просто по имени пакета.

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

Конечно, под каждый фреймворк можно написать свою интеграцию, но мы ведь пытаемся облегчить себе жизнь, правда?

Управление тестированием в TestOps: храните информацию, а не выводы

Изначально роботы не все делают одинаково.

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

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

.

Просто «думать наперед» будет недостаточно — вам придется просчитать, что будет с проектом и командой тестирования через год-два, а еще лучше — через три.

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



Как ОП решил эту проблему?

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

Наиболее яркими недавними примерами являются такие инструменты мониторинга, как Grafana и Graphite. Давайте посмотрим поближе и попробуем применить это к тестированию.

Администраторы и все те, кто работает в Ops, относятся к метрикам и данным с большой чуткостью и любовью.

Просто потому, что вы хотите узнать об сбое сервиса, сбое сети или недоступности кластера раньше пользователя, не так ли? Изначально весь мониторинг был построен по классической иерархической структуре: дата-центр → кластер → машина → метрики (ЦП, ОЗУ, хранилище и т. д.).

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

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

Построение такого среза с единой иерархической структурой — нетривиальная задача.

Проблему решили понятно и изящно: поместили все объекты в единый пул и начали помечать каждый нужными тегами.

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

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

Набор меток хранится в плоской структуре и свободно используется — любой критерий поиска, фильтрации или группировки становится меткой.

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

Этот метод управления данными позволяет не только фильтровать и делать выборки внутри структуры.

Он предоставляет еще один уровень свободы в виде упомянутой выше группировки: теперь можно смело делать запрос к хранилищу вида «показать статистику доступности всех машин, на которых запущен такой-то микросервис, сгруппированных по кластеры».

Парсер перебирает все машины, берет статистику доступности с тех, у которых есть метка микросервиса, и группирует их в кластеры.

В этом случае следующим запросом можно легко получить «загруженность кластера по географии» — дерево перебалансируется, перемещая кластеры на нижний уровень, а географию на первый.

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

Зайдите в дашборды любой Ops-команды крупного сервиса — здесь вы найдете отчеты по десятку метрик (время безотказной работы, загрузка ресурсов, количество пользователей и т. д.), разделенных по множеству критериев (география, балансировка между серверами и т. д.).

).

Да это просто папиная автоматизация! - ты говоришь.

И это здорово — это классическое решение проблемы масштабирования.

Конечно, у системы тегов есть несколько недостатков:

  • Вы не можете создать «скелет» папок и оставить их пустыми.

    Классическая практика из начала статьи, позволяющая продумать архитектуру на старте.

  • Неудобно для тех, кто последние годы работал с папами.

    Создание тестов требует тщательной компоновки и осмысленного подхода к формулированию каждого тестового примера.

    Если «проваленные» или «ненужные» тесты просто теряются в папках, здесь они будут бельмом на глазу.



Тестовые примеры: дерево против меток

— Ладно, с админами всё понятно.

Они сидят и целый день смотрят на показатели и обрабатывают данные.

Зачем нам это нужно? Ответ прост: мир разработки, к сожалению или к счастью, давно отошел от жесткой структуры — релизы ускоряются, сборки автоматизируются.

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

период (от 1-2 дней до недели), результат тестирования собирается и после полного завершения отправляется обратно в разработку.

Вам ничего не напоминает? Это старая добрая каскадная застройка (то есть водопад)! В 2021 году.

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

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

Как они тестируются? Скорость разработки и развертывания требует от тестирования быстрого получения результатов — больше нет времени на полуавтоматический анализ статического дерева — вашим коллегам нужно много данных из разных срезов.

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

Практики, направленные на скорость, повторяемость и стабильность выполнения тестов, а не на покрытие и оценку качества в широком смысле — об этом я со временем напишу отдельные статьи.

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

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

Проблема в том, что мы не знаем, какие отчеты понадобятся в будущем.

Если у вас нет времени готовить отчеты для коллег и бизнеса, то действительно ли тестирование приносит максимальную пользу?
Ведь никто не хочет иметь дело с закостеневшей структурой, удобной для отдела контроля качества.

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

Итак, давайте соберем метаданные и потом во всем разберемся.

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

Управление тестированием в TestOps: храните информацию, а не выводы

Пример представлений, которые можно получить в Allure TestOps в пару кликов из базы размеченных тестов.

Тестирование, как и мониторинг из примера, работает с метриками.

Их может быть много или очень много, и придумать универсальную и вечную структуру просто невозможно.

Но можно собрать и сформулировать комплексный набор показателей и критериев.

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

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

Самый наглядный пример — JIRA, где можно построить график, тренд или дашборд любого типа по любому полю тикета, собирать, фильтровать или группировать тикеты (могут понадобиться плагины! :)) в любую структуру прямо на встрече.

Согласитесь, звучит заманчиво: иметь гибкость билетов JIRA в управлении тест-кейсами.

Осталось только автоматизировать запуски для слияния веток и вот тестирование уже соответствует требованиям DevOps!

Управление тестированием в TestOps: храните информацию, а не выводы

Теги: #тестирование #Тестирование веб-сервисов #Тестирование ИТ-систем #тестирование веб-приложений #автоматизация тестирования #лучшие практики

Вместе с данным постом часто просматривают: