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