Единицы
1. Введение в искусственный интеллект в тестировании программного обеспечения и обеспечении качества: роли, границы, риск подделки и проверка 2. Генерация тестовых сценариев и тест-кейсов: от требования к комплексному контролю 3. Исследовательское тестирование и генерация тестовых идей: творческий поиск ошибок с помощью ИИ 4. Автоматизация тестирования пользовательского интерфейса: генерация кода Selenium, Playwright и Cypress с помощью ИИ 5. Автоматизация тестирования API: контракт, схема и сквозная проверка с помощью ИИ 6. Генерация и тестируемость модульных тестов: надежное тестирование с помощью ИИ 7. Написание отчетов об ошибках и определение приоритетов: четкие, воспроизводимые записи с помощью ИИ 8. Анализ тестового покрытия и тестирование на основе рисков: правильный подход с помощью ИИ 9. Регрессионное тестирование, сопровождение тестов и борьба с хрупкими тестами 10. Риск ложного доверия, качество тестов и тестирование мутаций: тестовые тесты 11. Сквозной рабочий процесс, интеграция CI/CD, этика и безопасность: ответственное использование ИИ
Единица 9 / 11

Регрессионное тестирование, сопровождение тестов и борьба с хрупкими тестами

Прибыль:

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

Программное обеспечение постоянно меняется; Каждая новая функция, каждое исправление может сломать то, что работало раньше. Последующее нарушение ранее работавшей функции называется регрессией. Регрессионное тестирование — это повторное тестирование существующей функциональности при каждом изменении, чтобы выявить эти ухудшения. Со временем эти наборы тестов становятся больше — тысячи тестов — и возникают две большие проблемы: набор замедляется, а нестабильные тесты — ненадежные тесты, которые иногда проходят, а иногда и терпят неудачу в одном и том же коде — подрывают уверенность команды в результатах тестов. Искусственный интеллект (ИИ) — мощный помощник в поддержании работоспособности, скорости и надежности набора регрессий. Но главное предостережение остается: хотя ИИ может предложить «пройти» хрупкий тест, он часто может создать патч, который скроет реальную ошибку. Ваша задача — найти первопричину нестабильности, а не подавлять симптомы.

Основные причины хрупких тестов

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

  • Условия синхронизации/гонки: тест проверяет результат, не дожидаясь завершения операции. Самая распространенная причина.
  • Зависимость от порядка: Тесты зависят от данных, оставленных друг другом; Он ломается при изменении порядка.
  • Общий случай: несколько тестов используют одни и те же тестовые данные/пользователя, что приводит к конфликту.
  • Внешняя зависимость: Реальная сеть, сторонний сервис, системное время, случайное значение.
  • Разница в среде: переключается на локальную среду, остается в CI (среда непрерывной интеграции).
Внимание: прохождение хрупкого теста путем «несколько повторных попыток» часто маскирует реальную ошибку параллелизма. Повторная попытка — это диагностический инструмент, а не лечение. Сначала найдите основную причину; Используйте повторную попытку только в крайнем случае при документированной, действительно внешней нестабильности.

Сопровождение тестирования: поддержание работоспособности пакета

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

1. Повторная/ненужная тестовая очистка. Со временем накапливается большое количество случаев тестирования одного и того же. ИИ предлагает группировать и объединять похожие тесты.

2. Хрупкая тест-диагностика. Вы передаете ИИ тестовый код и шаблон нестабильности; предлагает возможные коренные причины и постоянное решение.

3. Выбор тестов/приоритизация. Запускать весь пакет с каждым изменением дорого. Благодаря анализу воздействия тестов (выбору только соответствующих тестов на основе измененного кода) ИИ рекомендует, какие тесты следует запустить в первую очередь. Однако полный предварительный пакет является обязательным.

Карантин: правильное управление хрупким тестированием

Вы обнаружили, что тест ненадежен, но у вас нет времени сразу устранить основную причину. Что делать? Есть два неправильных способа: полностью удалить тест (это поведение вообще больше не сохраняется) или заставить его замолчать, повторив попытку (скрывая реальную ошибку). Правильный способ — поместить в карантин (временно отделив хрупкий тест от основной упаковки и отслеживая его в отдельном списке). Тестирование на карантине не предотвращает объединение версий, но остается видимым долгом и регулярно устраняется. Критический момент вот в чем: карантин — это зал ожидания, а не мусорное ведро. Если карантинный список растёт, это сигнал тревоги о том, что тестовое самочувствие команды ухудшается. ИИ может периодически просматривать ваш карантинный список и группировать его по основным причинам; Он позволяет принимать коллективные решения, выявляя общие причины, например, «все 6 тестов подключены к одному и тому же пользователю общего теста».

Совет: Добавьте к каждой карантинной записи «владельца» и «дату последней проверки». Заброшенный карантин становится постоянной свалкой; Хрупкие тесты живут там вечно, потому что всем плевать.

Таблица стратегий регрессии

Статус

Стратегия

Роль ИИ

незначительная коррекция

Зона поражения + тест на задымление

Выберите соответствующие тесты

новая функция

Сопутствующий модуль + интеграция

Предложите новый случай регрессии

большой рефакторинг

Полный пакет регрессии

Анализ пробелов в покрытии

предварительный выпуск

Полный пакет + разведка

Оценка приоритета и продолжительности

Срочное оперативное исправление

Сосредоточенный + критический путь

Минимальный безопасный набор тестов

Слабая подсказка / Сильная подсказка

Слабое: «Этот тест иногда дает сбой, исправьте это».
Сильный: «Этот тест завершается неудачно в 3 из 10 прогонов, код не изменяется. Диагностика основной причины нестабильности: это может быть время/раса, зависимость от порядка, общее состояние, внешняя зависимость или разница в среде. Покажите, какая строка в тесте указывает на каждую возможную причину. Предложите постоянное решение; НЕ предлагайте решения, подавляющие симптомы, такие как «добавить повторную попытку» — если это неизбежно, четко напишите причину. Тест: [код]. След ошибки: [журнал]».

Мощная подсказка; направляет диагноз на первопричину и прямо запрещает подавление симптомов.

Четыре копируемых шаблона

1) Диагностика хрупкого теста:

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

2) Предлагая случай регрессии:

Было внесено следующее изменение: [сводка изменений/PR]. Перечислите ТЕКУЩИЕ модели поведения, которые это изменение может нарушить, и предложите пример регрессионного тестирования для каждого из них. Особо выделите области побочных эффектов и общих зависимостей.

3) Очистка повторяющихся тестов:

Ознакомьтесь с набором тестов ниже. Группируйте повторяющиеся или перекрывающиеся случаи, проверяющие одно и то же поведение; Предложите, какие из них мне следует оставить, а какие объединить для каждой группы. Предупредите, если есть риск потери покрытия. Тесты: [список/код]

4) Выбор тестового эффекта:

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

три мини-кейса

Случай 1. Реальная ошибка, скрытая повторной попыткой. Одна команда добавила 3 ​​повторные попытки к случайной проверке оставшихся выплат; Теперь тест всегда был «пройден». Применение «диагностики хрупкого теста» показало, что нестабильность возникла из-за реальной гонки: при высокой нагрузке подтверждение платежа иногда обрабатывалось дважды. В течение нескольких месяцев Retry скрывала ошибку, которая могла привести к реальной потере денег. Основная причина устранена, повторная попытка удалена.

Случай 2 — Пакет уменьшился, скорость увеличилась. Регрессионный набор из 1400 тестов занял 55 минут. При «очистке дубликатов тестов» 380 тестов оказались дубликатами или закрытыми; слились. Пакет сократили до 900 тестов, время сократилось до 34 минут, покрытие заметно не уменьшилось. Более быстрая обратная связь побудила команду проводить тестирование чаще.

Случай 3 — Зависимость порядка. Тест всегда будет проходить локально, но в CI он может случайно завершиться неудачей. Диагностика ИИ показала, что тест зависел от пользователя, созданного другим тестом, в CI он сломался, потому что тесты выполнялись параллельно/в разном порядке. Каждый тест проводился для установления своих собственных данных; Нерешительность закончилась.

Распространенные ошибки

  • Отключение звука хрупкого теста с помощью повторной попытки. Повторная попытка без поиска первопричины; сокрытие настоящей ошибки.
  • Культура «снова застряла». Регулярное игнорирование красных результатов; Однажды, пропустив настоящую ошибку.
  • Пакет вообще не обрезается. Допущение скопления дублирующих тестов и замедления работы пакета.
  • Зависимость между тестами. Тесты основаны на общих условиях/последовательности; источник неопределенности.
  • Тестируем только измененную часть и пропускаем полный пакет. Ярлык предварительной версии; Скрытые побочные эффекты ускользают.
  • Опираясь на внешнюю зависимость. Тесты, основанные на фактической сети/частоте/случайном значении; естественно неустойчив.

В итоге

Регрессионное тестирование выявляет изменения, нарушающие ранее работающие функции; Но по мере роста пакетов медлительность и нестабильность тестирования подрывают доверие. Основными причинами нестабильного тестирования обычно являются время, зависимость от порядка, общее состояние и внешние зависимости. ИИ — мощный помощник в диагностике, очистке и выборе тестов; Но подавление нерешительности с помощью повторных попыток скрывает реальные ошибки. Найдите основную причину, сделайте тесты независимыми и детерминированными, регулярно сокращайте пакет, запускайте полный пакет перед выпуском.

Задача приложения

Выберите тест из своего проекта, который, как вы знаете, является хрупким (или кажется нестабильным). Извлеките кандидатов на первопричину и проверьте линии доказательств в тесте с помощью шаблона «хрупкий тестовый диагноз». Определите основную причину и внедрите постоянное решение без повторных попыток. Затем выберите 10 тестов из своего пакета и найдите те, которые можно объединить с «очисткой повторяющихся тестов». Сообщите, сколько нестабильностей в тестах вы устранили из-за их первопричины и сколько ненужных случаев вы удалили из пакета.

контрольный список

  • [ ] Я установил причину неустойчивости теста; Я не подавлял симптом.
  • [ ] Я рассматривал повторную попытку как оправданное последнее средство, а не лекарство.
  • [ ] Я сделал тесты независимыми и детерминированными (изолированными от внешних зависимостей).
  • [ ] Я удалил повторяющиеся/ненужные тесты из набора регрессионных тестов.
  • [ ] Я выбрал тестирование на основе изменений, но запустил полную предварительную версию пакета.
  • [ ] Я серьезно относился к каждому красному, вопреки культуре «снова застрял, пас».