Автор оригинала: Dave Dash.
Там грустное время в тестировании земли, когда у вас есть тестовый набор, на котором вы не можете положиться. Вместо того, чтобы запустить набор и слияние, если он пройдет, вы должны оглядываться на неудачные тесты и сказать «О, что один … этот тест — Флаки».
Тогда это становится классом тестов: «О, мы можем игнорировать Elasticsearch Estates. «В конце концов мы прекращаем доверять сборке и просто слиться. Потому что это, наверное, эластично-поисковый тест, который не удался. По крайней мере, я думаю, что это то, что сказал мой адрес электронной почты:
Создание все начинают размыть вместе.
Войти в охотник
Очевидно, мы не хотим тестовой набор, который мы не доверяем. Это всего лишь 10-20 замедление, которое не дает никакой ценности, если мы не пособием, это мудрость. Если он изыскал наполовину истин, нам нужно будет настроить их.
Охотник
Поэтому я решил охотиться на прерывистые тесты. Качественные суждения трудно справиться с:
- Тестовый люкс ненадежен.
- Elasticsearch — Flaky
- Моя кошка значима для меня
Хотя все эти заявления могут быть правдой, это может быть трудно их исправить и на самом деле чувствовать, что ваша починка ничего не сделала.
Измерить
Так время для измерения. Приятное свойство «прерывистых» тестов состоит в том, что они не будут вызвать изменение кода. Они просто потерпели неудачу, казалось бы, на случайном порядке. Так что я создал отделку нашего Мастер называется Circle-Ci-Test Отказ Я полагал хороший тест на то, как прерывистые наши тесты были бы, чтобы продолжать управлять тестами, и мы могли бы выглядеть в Circleci или протолкните статус результата в Datadog. .
Вот как я сделал это:
Мы делаем несколько вещей:
- Проверьте, были ли мы заняты построение других вещей.
- Вызвать сборку
- Хотя сборка запускается, смотрите и регистрируйте состояние последней сборки в DataDog.
Результат шага три это график.
Оранжевые сборки плохие, синие сборки хороши.
Когда-нибудь после полудня наша команда исправила некоторые тесты, и она сделала вещи реже.
Проверить только то, что вам нужно
В нашей конкретной ситуации у нас были проблемы с Elasticsearch. Наша платформа — это рельсы, поддерживаемые Postgres и Elasticsearch, то, что мы обнаружили, что у нас были некоторые тесты, которые полагались на присутствующие на присутствии Elasticsearch, но тесты оказались запросами до того, как Elasticsearch был готов служить.
Мы оказались в результате создания индекса, но никогда не добавляем ничего к индексу. Это то, что закончилось, бросая нас. Мы использовали некоторые хорошо размещенные тестирование, чтобы устранить необходимость elasticsearch:
dbl = double(:total => 0, :empty? => true, :map => nil) allow(Search).to receive(:perform_search).and_return(dbl
Наш тест никогда не смотрел на результаты, он только что проверил, что некоторые атрибуты рендеринга произошли.
Тестовый заказ
Некоторые вопросы были очень прерывистыми — 2-3% наших сборку потерпят неудачу. Мы были уверены, что тестовый заказ был частью нашей проблемы.
Я столкнулся во подобных вопросах в Pinterest, когда я Массивно распараллелированный тестовый набор. На Pinterest у нас не было никакой базы данных для наших тестов, это была проблема с издевательствами и уборкой. В этом случае мы имели дело с артефактами, оставшимися в базе данных.
rspec Оставил подсказку:
Randomized with seed 7918
Я мог бы бежать
rspec --seed 7918
Чтобы запустить тесты в том же порядке.
В сочетании с биссект Вариант я смог сузить набор тестов довольно немного, но была проблема с бислект. Большая часть нашего прерывания теперь была вызвана данными, оставшимися в базе данных между тестовыми прогонами. Эти никогда не были убраны даже после прогонов. Итак, биссект служил в качестве руководства.
Так свежу и так чистый
Мы использовали Очиститель базы данных GEM для очистки нашей базы данных между тестами. Работало великолепно в большинстве случаев, но было несколько раз обходиться. Мы включили это, используя до и после заявления, но если кто-то использовал вокруг В тесте, которое обменивалось бы транзакцией, которую набор драгоцелей.
Я обновил GEM и следовал с предложенным методом использования config.around. Всегда запустить тесты, используя DatabaseCleaner.Cleaning контекст. Это выглядело чистым, но многое сломалось, потому что модернизация. Как только мы очистили вопросы, у нас была сборка, которая была довольно чистой за последние четыре часа.
Конкурирующие философии
В идеале мы могли бы запустить каждый тест в изолированной, но однородной среде. Ни один тест не мешал бы друг другу, и все будет повторяться. Стоимость, однако, является мощность скорости и обработки. Если бы мы могли пройти 1000 тестов, все одновременно накладные расходы не повредили, но мы не можем сделать это.
Таким образом, мир, который мы живем в том, что тесты должны играть хорошее. Прямо сейчас дорога, которую мы взяли, в том, что каждый тест предполагает чистое состояние, и опирается на предыдущий тест, чтобы убрать после себя. Это нормально, но это может сделать для хрупкого тестового набора.
Соревновательная философия может быть той, которая требует от нас, чтобы убрать, прежде чем мы проведем наш тест по мере необходимости. Например, тест, который утверждает:
- Добавляет двух пользователей, Trish и надежда на систему
- Убедитесь, что в списке всех пользователей присутствуют только Trish и надежда
Может работать только, если мы предположим чистое состояние. В мире плохих тестов поведения, которые оставляют артефакты вокруг, нам может потребоваться добавить шаг:
- Удалить всех пользователей.
Threadoff заключается в том, что мы платим затраты, чтобы удалить всех пользователей, даже если нет пользователей для удаления.
Мы будем придерживаться бывшей философии сейчас, пока не станет невыносимым.
Там действительно нет никакой магии с прерывистыми тестами. Все наши неудачи имели логические причины неудачи. Если вы страдаете с этим вопросом, первый шаг — собирать метрики вокруг ваших тестов, так же, как вы могли бы собрать бизнес или операционные метрики.
После того, как вы собираете данные, вам нужно будет посмотреть на каждый тест индивидуально. Проблемы, в которых я столкнулся, были:
- Тестирующие системы, которые не были теплыми (elasticsearch)
- База данных не очищается
- Тестовый приказ сбивает с толку.
- Макеты не очищают себя.
Удачи.
Если вам понравилось этот пост, вы также можете наслаждаться этим:
Сохранение 60 часов инженера в день Как я сокращаю 30+ минут на 2 minutes_medium.com
Оригинал: «https://www.codementor.io/@davedash/hunting-intermittent-tests-mi7bseox7»