Привет, Хабр! Я — Ольга Султанова, руководитель тестирования в Рунити. Сегодня я расскажу о QA-метриках, которые мы применяем в работе: как мы их внедряли, как собираем данные, как автоматизируем и анализируем. А также о том, какие у нас стоят пороговые значения и о том, какие действия мы предпринимаем, когда они нарушаются.
Навигация по тексту:
→ Светофор
→ Выводы
Основные понятия
Метрики тестирования — это определенные показатели, которые дают нам возможность оценить качество программного обеспечения, производительность команды и любые другие поставленные цели. Мы пробовали различные метрики и остановились на тех, которые подошли именно нам и нашему продукту.
Мы разделили наши метрики на три блока:
Метрики дефектов;
Метрики автотестов;
Светофор.
Метрики дефектов
Метрик дефектов у нас 7:
Баги в старом коде;
Баги до релиза;
Баги после релиза;
Доля отфильтрованных дефектов;
Найдено авто-тестами;
Критичные баги;
Инциденты (тип, команда, сервис).
Баги в старом коде. Эта метрика нужна для измерения общего качества и понимания, сколько багов мы обнаружили в старом коде. Собираются автоматически из Jira: учитываются задачи с типом «Баг» и меткой «prod».
Баги до релиза. Их находит тестировщик. Благодаря этой метрике мы понимаем, сколько дефектов обнаружено в новой фиче до того, как мы ее зарелизили. Собираются автоматически из Jira. Считаются по количеству чек-боксов в чек-листе «only_for_qa» или количеству, указанному в поле «Внутренние баги» в тикетах с типом «Баг».
Баги после релиза — это баги, найденные тестировщиками, менеджерами, другими сотрудниками или пользователями после выпуска фичи. Собираются автоматически из Jira. Учитываются задачи с типом «Баг» и меткой «баг_в_новом_коде».
Вторая и третья метрики нужны для формирования четвертой — доля отфильтрованных дефектов. Это показатель эффективности обнаружения багов: мы смотрим, какую долю дефектов удалось отфильтровать, а какая все-таки попала на прод. Здесь есть определенный показатель, который мы не должны превысить — об этом расскажем далее. Рассчитывается по формуле: количество багов после релиза поделенное на количество всех багов (до и после релиза).
Баги, найденные автотестами. Эта метрика по большей части нужна для оценки эффективности наших автотестов. Собирается автоматически из Jira. Учитываются баги, найденные в проде, с меткой «autotesting»
Критичные баги. Эта метрика нужна командам для понимания, какой функционал был задет. Разумеется, критичных багов должно быть как можно меньше. Если их пропускается много — значит, в тестировании есть какие-то проблемы. Собирается автоматически из Jira. Учитываются баги, найденные в проде, с меткой «crit»
Инциденты — ситуации, задевшие более 10% пользователей. Мы смотрим на тип инцидента: либо инфраструктурный, либо ошибка разработки. Также смотрим, в какой команде произошел инцидент, и сервис этой команды. Все показатели мы в дальнейшем обрабатываем. Собирается автоматически из Jira с доски аварий. Из тикетов берется информация о типе, команде и сервисе, в котором произошел инцидент.
Если представить работу нашей команды и проставление меток дефектов в Jira в виде схемы, то получится вот так:
Метрики автотестов
Метрик автотестов мы используем всего четыре:
Общий процент покрытия автотестами требований в %;
Актуальное покрытие автотестами в шт;
Процент хрупкости сборок;
Средняя продолжительность сборок в минутах.
Общий процент покрытия автотестами требований в % — первая метрика, которую мы начинаем собирать. Все наши требования в виде тест-кейсов прописаны в Testrail. Мы смотрим, сколько из них покрыты автотестами, а сколько еще нет. Здесь у нас всё расписано по командам: мы можем наглядно посмотреть, сколько процентов по каждой команде у нас покрыто.
Актуальное покрытие автотестами в шт. Наша следующая метрика — это покрытие в штуках. Почти то же самое, но немного с другой стороны. Мы смотрим, сколько кейсов у нас может быть покрыто. В каких-то командах это более трех тысяч, а где-то — всего 30 кейсов. В этом случае подсчет в процентах не всегда будет информативен.
Процент хрупкости сборок собирается автоматически из логов автотестов. Смотрим по командам, определяем среднее значение. На примере ниже — за неделю: в каждой команде видим разный процент хрупкости. На этот процент влияют различные факторы: например, инфраструктурные проблемы или выкатка нового функционала, когда тестировщик не успел поменять автотесты, а на проде всё упало. Если баг задевает много функционала, то процент хрупкости за неделю будет высоким.
Из логов автотестов мы также берем среднюю продолжительность сборок. Эта метрика нужна нам для понимания того, какие сборки проходят медленно. Во-первых, для того, чтобы рассчитать время для тестирования, для запуска сборок. Во-вторых, чтобы увидеть проблемные билды, где тесты длятся больше часа. В таком случае нужно что-то делать: либо добавлять потоки, либо оптимизировать тесты, либо смотреть, как написаны тесты и все ли из них нам нужны.
Светофор
При помощи третьего блока метрик — светофора — мы отслеживаем ментальное состояние тестировщиков. Считаем, что это важный момент в нашей работе.
В этом блоке у нас две метрики:
Количество разработчиков и тестировщиков по командам;
Общее состояние сотрудника в текущем месяце.
Количество разработчиков и тестировщиков по командам — метрика, которая примерно показывает нагрузку на одного сотрудника. Без дополнительных данных это не очень объективная метрика: в командах могут быть разные задачи. Например, только технические, где не так много тестирования, либо продуктовые с высокой QA-нагрузкой. Метрика показывает, у каких сотрудников может быть перегруз, и к кому руководителю нужно в первую очередь обратиться с вопросом, всё ли хорошо. Эту метрику мы собираем из списка сотрудников на корпоративном портале.
Общее состояние сотрудника в текущем месяце — единственная метрика, которую мы собираем вручную. Тестировщики самостоятельно заполняют документ, указывая свой уровень нагрузки, и по желанию оставляют комментарий. Собираем метрику в конце каждого месяца и смотрим, как мы можем снизить нагрузку наших тестировщиков.
Автоматизация сбора метрик
Мы постарались максимально автоматизировать сбор метрик. Сейчас у нас 4 сервиса, из которых мы берем информацию:
Логи автотестов;
Баг-трекер;
Внутренний корпоративный портал;
TestRail.
Мы получаем информацию из этих источников при помощи самописного скрипта при помощи API. Затем результаты попадают в базу данных — у нас это MySQL. Оттуда они подтягиваются в Grafana, где превращаются в информативные графики и таблицы.
Анализ метрик тестирования
Теперь давайте разберемся, что делать дальше с собранными данными. Мы пришли к определенным пороговым значениям, при превышении которых понимаем, что у нас что-то идёт не так и нужно предпринимать действия. Сейчас таких значений у нас 5:
Количество багов после релиза в старом коде: не больше 10 за квартал
Количество багов после релиза: не больше 5 за месяц
Доля отфильтрованных дефектов: не больше 0,1
Покрытие автотестами требований в %: текущее значение не должно падать больше, чем на 10%
Хрупкость автотестов: не больше 5%
Анализ метрик мы также частично автоматизировали. При превышении пороговых значений скрипт отправляет отчет в корпоративный мессенджер. Также в Grafana можно посмотреть динамику и сравнить значения — как было до и какая ситуация сейчас. Проанализировав все данные, мы идем к команде тестировщиков, разработчиков или менеджеров с уточняющими вопросами или предложениями по улучшению процесса.
Выводы: зачем нам нужны QA-метрики?
Благодаря внедрению метрик тестирования мы понимаем нашу эффективность, производительность, видим сильные и слабые стороны. Несмотря на то, что метрики адаптированы в первую очередь под наши цели и потребности, я надеюсь, что другим командам будет близок наш подход. Мы почти полностью автоматизировали сбор и обработку данных: это позволило нам не только упростить процесс мониторинга, но и своевременно реагировать на возникающие проблемы через настроенные алерты. Такой пошаговый подход делает наши метрики актуальными и полезными, улучшает работу и эффективность команды, освобождает время от рутинных задач и позволяет сосредоточиться на важных целях.
Комментарии (4)
DmitryNet
26.09.2024 08:27На мой взгляд все это имеет малую практическую пользу. Но раз уж получение метрик автоматизировано, то как известно с овцы хоть шерсти клок.
Во-первых, измерять эффективность автотестов числом найденных багов - глупо. Хотя смотря в чем вы видите эффективность. Смысл автотестов - в покрытии. Если один тест баги находит, а другой нет - то это косяк разработчика в одном месте, и отсутствие косяка в другом. Оценивать можно разве только какой процент багов автотест пропустил до релиза, если таковые нашлись после. Но и то, от чего считать этот процент? Пропустил 1 из 1... Короче 100% не эффективность вышла. В этом месяце. В следующем месяце не нашел ничего, но и на проде ничего не случилось. Эффективность неизвестна...
Во-вторых, количество багов после релиза не больше 5 в месяц. А если больше, то что? А каких багов? Он может быть всего 1, и не за месяц, а за год, но такой что положит все. А может быть по 5 в день, и никому нет особо дела. Можно попробовать 1 инцидент считать за 10 или за 100 обычных багов. Но в чем смысл? Как минимум инциденты нужно считать отдельно от всего. А остальные уже можно как-то взвешивать относительно друг друга.
Ну и наконец покрытие автотестами... Хорошая вроде бы метрика. Если бы еще знать насколько эти автотесты реально эффективны. Но узнаете в лучшем случае уже после того, как они проявят свою (не)эффективность.
Как по мне - это имитация деятельности. Хотя возможно она нужна чтобы держать себя в форме.
breakingtesting
Здесь нет ошибки? Может быть вы имеете ввиду "возможность определить качество тестирования", а не качество продукта?
Подскажите, что значит общее качество и каким образом можно понять степень качественности опираясь на количество багов.
Баги до релиза могут быть не только в новых фичах, но и там, где новые фичи случайно что-то сломали. Вы такое не учитываете в этой метрике или вообще не учитываете?
Аналогично - баги могут оказаться и в старом коде, вы их учитываете здесь?
runity Автор
1) Вы правы, тут подразумевается "оценить качество тестирования ПО"
2) И здесь тоже "общее качество тестирования"
3) У нас нет привязки багов к фичам или конкретным релизам, поэтому учитываются все баги, которые не дошли до пользователя
4) Тут работает негласное правило - если баг появился в результате выкатки новой фичи (неважно, в существующем ранее коде или в новом), то считаем, что это "Баг после релиза"
breakingtesting
Понимаю, что этот показатель адаптирован под вас и вы по нему принимаете какие-то решения. Однако я думаю, что если все-таки учитывать в каком именно коде - в новом коде/новых фичах или в старом - появился баг, то можно прийти к полезным предположениям, может быть и выводам:
Ситуация 1: после релиза обнаружился баг в новом:
- предположение 1: что-то пошло не по плану в процессе релиза;
- предположение 2: что-то в тестировании фичей пошло не так;
Ситуация 2: после релиза обнаружился баг в старом:
- предположение 1: некорректный/неполный регрессионный набор был запущен именно для этого релиза;
- предположение 2: в целом регрессионный набор не соответствовал (не успели прогнать, не успели/забыли/не планировали покрывать кейсами старый код)
Думаю что понимание в каком коде появился баг - в старом или новом - важно и поможет выявить разные проблемы: поле для анализа здесь открывается не маленькое.