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