Что снижает этот показатель в автоматизированном тестировании UI

Селекторы

  • Редизайн, который ничего не меняет функционально, делает набор тестов красным.

  • Именно сюда уходит большая часть времени на сопровождение.

Ожидания

  • Фиксированные задержки медленны и всё равно нестабильны. Правильному ожиданию нужно знать, чего именно ждать.

  • Большая часть нестабильности идёт отсюда.

Покрытие, написанное вручную

  • Вы покрываете то, что кто-то написал, — интересные сценарии, а не те, которые ломаются.

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

Момент, когда набор тестов умирает

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

Никто не решает перестать доверять набору тестов. Доверие размывается само.

Как защитить этот показатель

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

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

  • Относитесь к перезапуску как к находке. Если тесту понадобился перезапуск, что-то не так с самим тестом или с окружением. Зафиксируйте это, а не идите дальше.

Структурная часть

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

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

Терминал

npm install -g @testsprite/testsprite-cli
testsprite setup

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

Как вернуть упавший показатель

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

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

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

Запускайте там, где падения обходятся дешевле всего

На каждом pull request, чтобы падение указывало на одно изменение, а не на неделю изменений.

  • GitHub App — это вебхук, который вы настраиваете в панели TestSprite. Он слушает событие деплоя, которое ваш пайплайн уже создаёт, поэтому в репозитории ничего менять не нужно.

  • GitHub Actions встраивает этот шаг в ваш собственный workflow, настраиваемый из терминала.

Как TestSprite защищает этот показатель

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

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

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

Какой процент прохождения тестов считать нормальным?

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

Как чинить нестабильные тесты?

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

Стоит ли удалять старые тесты?

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

Должен ли набор тестов блокировать слияния?

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

Как это измерять?

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

Коротко

Покрытие — не то число, которое имеет значение.

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