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

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

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

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

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

Ниже перечислены самые распространённые термины и понятия, связанные с flaky-тестами, в научных публикациях по компьютерным наукам:

  • flaky-тест

  • Все тесты нестабильны (all tests are flaky — ATAF)

  • Матрица ошибок классификации (confusion matrix)

  • Детерминированный исход/результат

  • Недетерминированный исход/результат

  • Распределённые тесты

  • Энтропия

  • Длины серий отказов

  • Ложная тревога/оповещение

  • Тест, выявляющий дефект

  • Сбой, вызванный выявленным дефектом

  • Flakiness (нестабильность тестов)

  • Жёсткая нестабильность

  • Мягкая нестабильность

  • О��енка нестабильности

  • Снижение нестабильности (FR)

  • Потери в обнаружении дефектов (LFD)

  • Нестабильная сборка (flaky build)

  • Flaky-сбой

  • Доля нестабильности / частота нестабильности / уровень нестабильности / частота отказов из-за flaky-тестов

  • Нестабильный набор тестов

  • Словарь flaky-тестов

  • Переключение / переход (flip / transition)

  • Частота переключений / частота переходов

  • Нестабильность инфраструктуры

  • Негерметичные тесты

  • Зависимость от порядка выполнения (OD)

  • Вероятностная оценка нестабильности (PFS)

  • Карантин

  • Степень нестабильности

  • Flaky-тест, зависящий от ресурсов (RAFT)

  • SUT (System Under Test)

  • CUT (Code Under Test)

  • Системная нестабильность

  • Запахи тестов

Flaky-тест

Существует много определений flaky-теста, и все они сводятся к одной идее: это тест, который при многократном выполнении на одной и той же версии кода то проходит, то падает.

Формальное определение звучит так: flaky-тест — это тест, который даёт недетерминированный результат.

Все тесты нестабильны (ATAF)

Это предположение о том, что любой тест можно считать flaky. Единственное различие между тестами — как часто они падают (просто иногда эта частота может быть равна нулю).

Матрица ошибок классификации

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

Четыре компонента матрицы ошибок определяются в контексте классификации теста (или падения) как «flaky» (положительный класс) или «не flaky» (отрицательный класс):

  • Истинно положительный (TP): flaky-падение корректно распознано как нестабильность.

  • Ложно отрицательный (FN): flaky-падение ошибочно распознано как стабильный (или отнесено к «настоящим» падениям).

  • Ложно положительный (FP): стабильный тест ошибочно классифицирован как нестабильный.

  • Истинно отрицательный (TN): стабильные (не flaky) результаты теста корректно распознаны как стабильные; «настоящее» падение, которое не совпадает ни с одним flaky-падением.

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

Детерминированный исход/результат

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

Стабильные/надёжные тесты дают детерминированные результаты.

Недетерминированный исход/результат

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

Результат теста недетерминированен, если он иногда проходит, а иногда падает.

Распределённые тесты

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

Например, запуск тестов параллельно на разных машинах — это распределённое тестирование; запуск тестов против SUT, развернутой на нескольких узлах, — тоже распределённое тестирование.

Энтропия

В научном смысле это мера случайности. В контексте flaky-тестов под энтропией понимают метрику, которая выявляет нестабильность по вариативности результатов теста. Энтропия измеряет случайность (или неопределённость) в истории прохождений/падений теста.

Она вычисляется по формуле:

Где:

  • p(i) — вероятность каждого исхода i (прохождение или падение).

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

Связанные термины: частота переключений / частота переходов.

Длины серий отказов

Это длина последовательностей подряд идущих падений при многократном запуске flaky-тестов; её используют, чтобы определить, сколько повторных прогонов нужно, чтобы проявилась нестабильность.

Ложная тревога/оповещение

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

Тест, выявляющий дефект

Тест, который после повторных прогонов в рамках ��дной и той же сборки продолжает стабильно падать, тем самым выявляя регрессию.

Сбой, вызванный тестом, выявляющим дефект

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

Нестабильность

Нестабильность (flakiness) — это свойство теста давать непоследовательные, ненадёжные или недетерминированные результаты.

Жёсткая нестабильность

Определение нестабильности, используемое в количественном тестировании (например, в A/B-тестировании) и совпадающее с традиционной бинарной трактовкой вердикта: нестабильность фиксируется, когда при повторных запусках меняется окончательный вердикт «прошёл/упал».

Мягкая нестабильность

Определение нестабильности, специфичное для количественного тестирования (например, в A/B-тестировании): нестабильность выявляется по колебаниям количественных значений метрики качества (fitness) между повторными запусками, даже если вердикт «прошёл/упал» остаётся неизменным.

Скоринг нестабильности (flakiness scoring)

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

Flakiness score

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

В Meta есть похожая внутренняя метрика: вероятностная оценка нестабильности.

Снижение флейков (Flake reduction — FR)

Это метрика оценки, используемая для измерения эффективности подхода к оценке нестабильности при фильтрации flaky-тестов.

FR определяется как доля падений flaky-тестов, удалённых фильтрацией. Она показывает, сколько «шума из-за нестабильности» удалось убрать после автоматического игнорирования тестов, чья оценка нестабильности превышает установленный порог.

Flake reduction (FR)

Снижение нестабильности (FR)

  • Высокий FR = хорошо: фильтрация убрала большинство ненадёжных падений (меньше шума).

  • Низкий FR = плохо: многие падения flaky-тестов всё ещё остаются.

Потери в обнаружении дефектов (LFD)

Это метрика оценки, используемая для измерения эффективности подхода к оценке нестабильности при фильтрации flaky-тестов.

LFD — это доля реальных (детерминированных) дефектов, где «дефекты» определяются как детерминированные падения на конкретном коммите/версии SUT. Эта метрика измеряет нежелательный побочный эффект фильтрации flaky-тестов: сколько реальных дефектов (то есть не связанных с нестабильностью) было ошибочно отфильтровано.

Loss in fault detection (LFD)

Потери в обнаружении дефектов (LFD)

  • Низкий LFD = хорошо: мало реальных багов случайно игнорируется.

  • Высокий LFD = плохо: фильтрация убирает реальные, детерминированные падения.

Нестабильная сборка (flaky build)

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

Флейковое падение (flaky failure)

Падение теста, которое вызвано именно flaky-тестом.

Flaky rate / flake rate / flakiness rate / flaky-test-failure rate (частота/доля флейковости)

Эта метрика показывает, как часто тест демонстрирует flaky-поведение. Доля флейковости измеряет, какая часть выполнений теста является flaky за заданный период наблюдения.

Доля флейковости рассчитывается по формуле:

Flaky rate

Где:

  • t — конкретный тест.

  • F(t) — число flaky-выполнений теста t.

  • E(t) — общее число выполнений этого теста за наблюдаемый период. Обычно здесь используют число прогонов тестов или число сборок.

Иными словами, эта метрика показывает степень нестабильности.

Для расчёта доли flaky в скользящем окне по времени или по сборкам формула принимает вид:

Flaky rate

Где:

  • t — конкретный тест.

  • N — число последних сборок (размер окна).

  • Flaky(t,i) = 1, если тест t был flaky в сборке i, иначе 0.

К другим способам количественно оценить нестабильность относятся частота переключений (flip rate — измеряет, как часто тест переключается между «прошёл» и «упал») и энтропия (измеряет случайность результатов).

Набор тестов (flaky test suite)

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

Словарь flaky-тестов

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

Словарь, связанный с flaky-тестами, содержит слова вроде job, table, action, wait, process, timeout, duration, thread, sleep, idle и т. п., и может зависеть от языка программирования и фреймворка автотестов.

Переключение / переход (flip / transition) 

Flip, или transition, означает изменение результата теста между запусками, коммитами или версиями SUT.

  • Pass → Fail: тест начинает падать после изменения кода.

  • Fail → Pass: тест снова начинает проходить после изменения кода.

Переход (переключение результата теста) указывает на значимое изменение в поведении теста.

Частота переключений / частота переходов 

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

Она вычисляется по формуле:

Flaky rate

Если тест ни разу не переключается, его частота переключений равна 0. Если тест переключился один раз из Pass → Fail за 3 запуска, частота переключений равна 1/3, или 0,33. Если тест переключился 3 раза за 3 запуска, частота переключений равна 3/3 = 1. Таким образом, частота переключений позволяет улавливать различия в поведении тестов.

Нестабильность инфраструктуры

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

Негерметичные тесты (non-hermetic tests)

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

Связанные термины: неизолированные тесты, системные тесты, end-to-end тесты, распределённые тесты.

Зависимость от порядка выполнения (OD)

Зависимость от порядка выполнения тестов — это ситуация, когда результат одного теста зависит от того, в каком порядке запускаются тесты. OD — одна из ключевых причин нестабильности, и этот термин включён в список потому, что он приводит к нестабильности именно по вине самих тестов.

У OD есть собственный словарь терминов, включая victim test, polluter и state-setter и другие. Однако эти термины выходят за рамки данной статьи и рассматриваются в соответствующих публикациях.

Вероятностная оценка нестабильности (PFS)

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

PFS измеряет вероятность нестабильности теста и может использоваться для оценки и мониторинга надёжности тестов.

В Apple есть похожая внутренняя метрика: оценка флейковости (flakiness scoring).

Карантин

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

Степень флейковости

Это степень выраженности (или распространённости) flaky-поведения (то есть нестабильности) для конкретного теста.

Универсальной шкалы не существует. Опираясь на независимый анализ истории результатов тестов и отчётов о дефектах, некоторые исследователи ранжируют тесты как нефлейковые (NF), слегка флейковые (SF), флейковые (F) или очень флейковые (VF).

Flaky-тест, зависящий от ресурсов (RAFT)

Тест, у которого частота падений статистически отличается при ограничении вычислительных ресурсов (например, числа ядер CPU или объёма RAM) по сравнению с запуском без таких ограничений.

SUT (System Under Test)

Любой аппаратный или программный компонент, который в данный момент тестируется. SUT может быть приложением любого типа, API, UI и т. д.

CUT (Code Under Test)

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

CUT — частный случай SUT.

Системная нестабильность

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

Запахи тестов

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

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

Научиться автоматизации тестирования на Java --> специализация QA Automation Engineer
Научиться автоматизации тестирования на Java --> специализация QA Automation Engineer

Если хочется перейти от словаря терминов к практическим привычкам, курс «QA Automation Engineer» собирает базу по Java-автотестам: UI/API, Selenium/Selenide, JUnit, Cucumber, Maven и работа с тестовой инфраструктурой. Отдельный упор — на паттерны PageObject/ScreenPlay и навыки, которые снижают flakiness, а не маскируют её ретраями.

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

  • 15 января, 20:00. «Mutation Testing: как я узнал, что мои тесты с 95% coverage ничего не проверяют». Записаться

  • 21 января, 20:00. «Особенности Kotlin в UI и API тестировании». Записаться

  • 22 января, 19:00. «Искусство интервью в QA: оценка кандидатов без ошибок». Записаться