Это продолжение серии статей о нестабильных тестах.
В первой статье(оригинал/перевод на хабре) говорилось о 4 компонентах, в которых могут возникать нестабильные тесты.
В этой статье дадим советы как избежать нестабильных тестов в каждом из 4 компонентов.
Компоненты
Итак 4 компонента в которых могут возникать нестабильные тесты:
Сами тесты;
Фреймворк для запуска тестов;
Сервисы и библиотеки, от которых зависит тестируемая система и тестовый фреймворк;
Операционная система и устройство с которым взаимодействует фреймворк автотестирования.
Это отображено на рисунке 1.

Причины, варианты локализации проблемы и варианты решения нестабильности обсуждаются ниже.
Сами тесты
Сами тесты могут быть нестабильными.
Причины могут быть в тестовых данных, сценариях автотестов, предусловии автотестов и начальных состояниях других зависимостей.
Таблица 1 — Причины, варианты локализации проблемы и варианты решения нестабильности в самих тестах.
Причины нестабильных тестов | Варианты локализации проблемы | Варианты решения |
Неправильная инициализация или очистка. | Ищите предупреждения компилятора о неинициализированных переменных. Проверьте код инициализации и очистки. Проверьте, что среда настроена и очищена правильно. Убедитесь, что тестовые данные верные. | Явно инициализируйте все переменные правильными значениями перед их использованием. Правильно настройте и очистите тестовую среду. Убедитесь, что первый тест не вредит состоянию тестовой среды. |
Неправильно подобранные тестовые данные. | Перезапустите тесты самостоятельно. | Сделайте тесты независимыми от какого-либо состояния из других тестов и предыдущих запусков. |
Неправильное предположение о состоянии системы. Примером может служить системное время. | Проверьте зависимости приложения. | Удалите или изолируйте зависимости вашего приложение от аспектов среды, которые вы не контролируете. |
Зависимости от времени выполнения, ожидание появления асинхронных событий в определенном порядке, ожидание без тайм-аутов или состояние гонки между тестами и приложением. | Логируйте время, когда были обращения к приложению. В рамках отладки добавьте задержки для проверки результатов прогона автотеста. | Добавьте в тесты элементы синхронизации, чтобы они ждали определенных состояний приложения. Отключите ненужное кеширование, чтобы иметь предсказуемый график ответов приложения. НЕ ДОБАВЛЯЙТЕ явные ожидания, это может привести к нестабильности тестов в будущем. |
Зависимость от порядка запуска тестов (Вариант решения схож с второй причиной). | Перезапустите тесты самостоятельно. | Сделайте тесты независимыми от какого-либо состояния из других тестов и предыдущих запусков. |
Фреймворк для запуска тестов
Ненадежный фреймворк для запуска тестов может привести к нестабильности
Таблица 2 — Причины, варианта локализации проблемы, и варианты решения нестабильности в фреймворке для запуска тестов
Причины нестабильных тестов | Варианты локализации проблемы | Варианты решения |
Неспособность выделить достаточно ресурсов для тестируемой системы, что приводит к ее сбою. | Проверьте логи, чтобы удостовериться появилось ли приложение. | Выделите достаточно ресурсов. |
Неправильное планирование тестов, поэтому они "противоречат" и приводят к сбою друг друга. | Запустите тесты в другом порядке. | Сделайте тесты независимыми друг от друга. |
Недостаточно системных ресурсов для выполнения требований тестирования (Схоже с первым случаем, но здесь ресурсы потребляются во время выполнения рабочего процесса). | Проверьте системные логи, чтобы удостовериться не закончились ли ресурсы. | Устрани утечки памяти или другие утечки ресурсов. Выделите достаточно ресурсов для прогона тестов. |
Сервисы и библиотеки, от которых зависит тестируемая система и тестовый фреймворк
Приложение (или тестируемая система) может быть источником нестабильности.
Приложение также может иметь множество зависимостей от других служб, и каждая из этих служб может иметь свои собственные зависимости.
В этой цепочки каждый сервис может послужить причиной возникновения нестабильных тестов.
Таблица 3 — Причины, варианта локализации проблемы, и варианты решения нестабильности в приложении или тестируемой системе
Причины нестабильных тестов | Варианты локализации проблемы | Варианты решения |
Состояние гонки. | Логируйте доступ к общим ресурсам. | Добавьте в тесты элементы синхронизации, чтобы они ждали определенных состояний приложения. НЕ ДОБАВЛЯЙТЕ явные ожидания, это может привести к нестабильности тестов в будущем. |
Непроинициализированные переменные. | Ищите предупреждения компилятора о неинициализированных переменных. | Явно инициализируйте все переменные правильными значениями перед их использованием. |
Медленный ответ или отсутствие ответа при запросе от теста. | Логируйте время когда делаются запросы и ответы. | Проверьте и устраните все причины задержек. |
Утечки памяти. | Посмотрите на потребление памяти во время прогона тестов. В обнаружении проблемы поможет инструмент Valgrind. | Исправьте программную ошибку вызывающую утечку памяти. В этой статье на wikipedia есть отличное описание этих типов ошибки. |
Избыточная подписка на ресурсы. | Проверьте логи, чтобы узнать не закончились ли ресурсы. | Выделите достаточно ресурсов для запуска тестов. |
Изменения в приложении и в тестах происходят с разной скоростью. | Изучите историю изменений. | Введите правило при изменении кода, писать на это тесты. |
Операционная система и устройство с которым взаимодействует фреймворк автотестирования
Наконец, оборудование и операционная система могут быть источником нестабильности тестов.
Таблица 4 — Причины, варианта локализации проблемы, и варианты решения нестабильности в ОС и устройстве с которым взаимодействует фреймворк автотестирования
Причины нестабильных тестов | Варианты локализации проблемы | Варианты решения |
Сбои или нестабильность сети. | Проверьте наличие ошибок в системных логах. | Исправьте аппаратные ошибки либо запускайте тесты на другом оборудовании. |
Дисковые ошибки. | Проверьте наличие ошибок в системных логах. | Исправьте аппаратные ошибки либо запускайте тесты на другом оборудовании. |
Ресурсы, потребляемые другими задачами / службами, не связанными с выполняемыми тестами. | Изучите активность системного процесса. | Сократите активность процессов не связанных с прогоном тестов. |
Заключение
Как видно из большого разнообразия сбоев, снижение нестабильности при автоматизированном тестировании может быть довольно сложной задачей. В этой статье описаны области и типы нестабильности, которые могут возникать в этих областях, поэтому она может служить шпаргалкой при локализации причины нестабильных тестов.
Ссылки на источники
Откуда берутся нестабильные тесты? (оригинал/ перевод статьи на хабре)
Нестабильные тесты в Google и как мы их исправляем (оригинал)
Мои тесты на Selenium не стабильны! (оригинал)
Избегайте нестабильных тестов (оригинал)
Нестабильные тесты — одна из основных проблем автоматизированного тестирования(оригинал/ перевод статьи на хабре)