У меня есть четыре теста в моем наборе Capybara/Rspec, которые продолжают работать с ошибкой (настоящая проблема для развертывания CI).Что такое систематический подход к отладке периодически прерывающихся спецификаций?
Хуже всего то, что эти тесты прерываются с перерывами, и часто только при запуске всего пакета, что затрудняет его отладку.
Все они являются запросами ajax, либо отправляют удалённую форму, либо удаляются по удаленной ссылке, а затем expect(page).to have_content 'My Flash Message'
.
Эти испытания даже периодически прерываются в течение одного и того же цикла испытаний. Например, у меня есть несколько моделей, которые ведут себя одинаково, поэтому я повторяю их для тестирования.
e.g.,
['Country', 'State', 'City'].each do |object|
let(:target) { create object.to_sym }
it 'runs my frustrating test' do
end
end
Иногда страна терпит неудачу, иногда государство, иногда все проходит.
Я попытался добавить wait: 30
в инструкцию ожидания. Я попытался добавить sleep 30
перед оператором expect. Я все еще получаю прерывистые проходы.
Существует довольно много информации, описывающей тонкие тесты ajax, но я не нашел много о том, как отлаживать и исправлять такие проблемы.
Я очень благодарен за любые рекомендации или указатели от других, прежде чем вытащить все мои волосы!
UPDATE
Спасибо за все эти прекрасные ответы. Было полезно увидеть, что другие сталкиваются с подобными проблемами и что я не одинок.
Итак, есть ли решение?
Рекомендации по использованию инструментов отладки, такие как pry, byebug, функция отладки Poltergeist (спасибо @ Jay-Ar Polidario, @TomWalpole) были полезны для подтверждения того, что, как я думал, я уже знал, а именно, как предложено @ BM5K) что функции работают последовательно в браузере, а ошибки лежат в тестах.
Я экспериментировал с настройкой тайм-аутов и повторных попыток (@ Jay-Ar Polidario, @ BM5K), и хотя улучшение было по-прежнему непрочным решением. Что еще более важно, этот подход был похож на исправление отверстий, а не на правильное исправление, и поэтому я не был полностью доволен.
В конечном итоге я пошел с переписью этих тестов. Это повлекло за собой разрушение многоступенчатых функций и настройку и тестирование каждого шага по отдельности. В то время как пуристы могут утверждать, что это не действительно проверяет с точки зрения пользователя, есть достаточное совпадение между каждым тестом, что мне удобно с результатом.
Пройдя этот процесс, я заметил, что все эти ошибки были связаны с «нажатием на вещи или заполнением форм», как предположил @BoraMa. Хотя в этом случае опыт был отменен - мы приняли синтаксис .trigger('click')
, потому что capybara + poltergeist сообщал об ошибках, нажимая на элементы с использованием click_link
или find(object).click
, и именно эти тесты были проблематичными.
Чтобы избежать этих проблем, я удалил JS из тестов как можно больше. то есть тестировать большинство функций без включенной JS, а затем создавать очень короткие целевые JS-спецификации для тестирования конкретных ответов JS, функций или отзывов пользователей.
Таким образом, на самом деле нет ни одного исправления.Большой рефакторинг, который, честно говоря, вероятно, должен был произойти и был ценным упражнением. Тесты потеряли некоторые функции, разбив все на отдельные тесты, но в целом это упростило чтение и обслуживание тестов.
Есть еще несколько тестов, которые иногда показывают красный цвет, и потребуется еще одна работа. Но в целом большое улучшение.
Благодарим вас за великое руководство и заверили меня, что взаимодействие в среде тестирования может быть основной причиной.
Неужели ошибка всегда отображается одинаково? Просто чтобы иметь идею, вы могли бы добавить ошибку образца? У нас также были прерывистые неудачные спецификации, но мы выяснили, что это была другая независимая ошибка, которая вызывала это. –
Всегда то же самое. Я либо ожидаю флэш-контента 'Failure/Error: expect (page) .to has_content" # {target.model_name.human} был отмечен! " ожидается найти текст «Страна была отмечена!» в ...... 'или селектор' Failure/Error: expect (page) .to have_selector "a.unflag-btn" ожидается найти css "a.unflag-btn", но не было совпадений ' –
' save_and_open_page 'не показывает ничего очевидного. и эти тесты проходят при запуске инсоляции и с перерывами с пакетом. –