Путаница Капибара + Селен + Докер: Удаленный Firefox зависает - PullRequest
0 голосов
/ 12 октября 2018

Мы оказались в тупике , пытаясь выяснить, как заставить тестирование Selenium JavaScript работать с нашим приложением Dockerised Ruby (Hanami).Для примеров спецификаций, которые не зависят от JavaScript, конечно, драйвер Rack :: Test по умолчанию для Capybara подходит, но каждое современное приложение в той или иной мере зависит от JavaScript, и наше не будет / не будет отличаться.

Я прочитал несколько ответов здесь, на SO, и начал перебирать GitHub в поисках случайных похожих проектов, но мы были остановлены на все более политически неустойчивый период времени здесь.

Подводя итог:

  1. Мы можем успешно запустить спецификации функций с использованием JavaScript, если no спецификации не-JS выполняются в одном и том же вызове rake.(Мы используем jbodah/minitest-tagz для фильтрации вызовов спецификаций);
  2. При запуске нашего полного набора спецификаций Firefox Marionette зависает при запуске примера с поддержкой JavaScript, и его сообщение журнала указывает, что ононе имеет IP-адреса, к которому он должен подключаться.

Мы нашли только очень ограниченный набор учебных пособий / пошаговых руководств, которые, очевидно, применимы, в основном довольно длинные в зубе к 2018 году.наиболее очевидными являются следующие:

  1. Интеграционное тестирование с докеризованным Selenium и Capybara , выполненное Ахметом Кизилаем в феврале 2016 года;и
  2. Dockerized Rails Испытания капибары на вершине Selenium , Альфредо Мотта в мае 2016 года.

Это вероятно, или внаименее вероятно, что мы постоянно неправильно читали или приукрашивали то, что сейчас кусает нас.Стоит также отметить, что внутренние компоненты Docker, особенно связанные с сетевыми технологиями, похоже, значительно эволюционировали за последние два года, и это может иметь какое-то отношение к нашей проблеме.

Я включил копии следующих файловв Gist , поскольку их слишком много в совокупности для вставки:

  1. 00-Capybara-Selenium-Docker-confusion__readme.md: это постановка задачи;
  2. 01-docker-compose.yml: файл docker-compose.yml для приложения;
  3. 02-run_tests.sh: файл scripts/run_tests.sh, который используется как command, выполняемыйконтейнер web, как указано в файле docker-compose;
  4. 03-features_helper.rb: `spec / features_helper ', требуемый каждой спецификацией функции;в первую очередь относится к настройке Selenium;
  5. 04-Dockerfile: Dockerfile, используемый для создания контейнера web;
  6. 05-join_as_member_spec.rb: одна из спецификаций функции, которая работает с JavaScript в приложении;
  7. 06-focused_logfile.log: вывод терминала при запуске docker-compose up --exit-code-from web с использованием только примеров спецификаций с использованием JavaScript;
  8. 07-unfocused_logfile.log: вывод терминала из одного и того же вызова docker-compose со всеми примерами во всех спецификациях (т. Е. Не ограничен использованием tag :focus).

Любые полезные комментарии и / или ссылки на существующие рабочие тестовые установки (независимо от используемой платформы, например, Rails) будут очень оценены.Спасибо.

1 Ответ

0 голосов
/ 12 октября 2018

Наконец-то! Мы исправили эту проблему неожиданно очень .Ниже приведен текст (исключая образец отчета о статическом анализе) коммита, который мы только что отправили в репо нашего проекта.Спасибо за полезные комментарии от всех, в частности / u / nyekks на Reddit .

Исправлена ​​ошибка Selenium, которая не была проблемой Selenium

Это был долгий путь, чтобы добраться оттуда сюда ...

Мы гонялись за нашим хвостом в течение дней, , не говоря уже о многих, пытаясь понять, почемунаши тесты Selenium JavaScript явно ломали Docker.В конце концов, мы опубликовали просьбы о помощи в Reddit, StackOverFlow и Gitter;все варианты (и ссылки) этой Суть .

Оказывается, проблема не была (полностью) с Селеном, Капибарой, Докером и / или взаимодействием между ними. @ mitpaladin в конечном итоге обнаружил случайное начальное число (15474), которое при указании через переменную окружения TESTOPTS, передаваемое Rake в scripts/run_tests.sh, давало бы зеленую полосу.Это было интересно, но не обязательно прямо полезно;Доказав, что шанс получения зеленой полосы был как минимум 1 ((2 ** 333) - 1), сами тесты не нанесли непоправимого ущерба.(Ваши шансы, однако, намного выше в вашей местной лотерее.) Когда мы оба занялись дальнейшими онлайн-исследованиями, @mitpaladin снова пришел к выводу, найдя несколько ответов StackOverflow, таких как этот , который указывал (средний) палецпрямо на ... DatabaseCleaner всех вещей.Честно говоря, их README слегка затрагивает проблему , но, если вы еще не знаете, что именно ищете, вы, вероятно, не подумаете об этом дважды, даже если прочитаете ее.

Изменение DatabaseCleaner.strategy с :transaction на :deletion позволило всем работать;после внесения изменений мы были немедленно вознаграждены зеленой полосой.(Существует константа DB_CLEANER_STRATEGY, определенная в spec/spec_helper.rb, однако, на всякий случай, нам когда-нибудь понадобится изменить ее снова.)

Теперь, возможно, мы сможем вернуться к своим головам и выяснить, что мы пыталисьвыполнить после этой новой функции спецификации lo!много дней назад.

...