Что может вызвать Capybara :: Poltergeist :: TimeoutError: в групповом тестировании это не индивидуально? - PullRequest
0 голосов
/ 01 мая 2018

Приложение Rails, которое использует удаленное тестирование для тестирования приложения CakePHP, работающего на виртуальной машине Vagrant Ubuntu. Моя ОС MacOS High Sierra.

'rspec/rails'
'capybara/rails'
'capybara/mechanize'
'capybara/poltergeist'
'phantomjs'

Если я бегу rspec ./spec/features/my_tests_folder/, первые 2 теста в папке всегда проходят, а остальные всегда заканчиваются Capybara::Poltergeist::TimeoutError:.

Если я выполню какие-либо тесты в этой папке по отдельности, они ВСЕ будут проходить ВСЕГДА.

Всего 7 тестовых файлов. У каждого из них есть 1 особенность с 1 сценарием. Все js: true.

Я пытался увеличить :timeout в Capybara.register_driver и увеличить default_max_wait_time в Capybara.configure. Ни один не изменил результат.

Я также играл с Capybara.reset! после и перед каждым тестом. Это тоже не имело значения.

Когда я запускал это с config.order = :random, иногда 5 из 7 имели ошибки, иногда только 2 из 7. Но всегда были некоторые ошибки и некоторые ошибки. Кроме того, каждый тест был в группе ошибок как минимум один раз.

У меня заканчиваются идеи. Что может вызвать что-то подобное?

ОБНОВЛЕНИЕ (включая конфиги Capybara и Poltergeist и пример неудачного теста):

Конфиги в rails_helper.rb:

Capybara.register_driver :poltergeist do |app|
  options = {
    :timeout => 90, # default is 30
    :js_errors => false,
    :phantomjs => Phantomjs.path,
    # :debug => true
  }
  Capybara::Poltergeist::Driver.new(app, options)
end

Capybara.register_driver :mechanize do |app|
  driver = Capybara::Mechanize::Driver.new(app)
  driver.configure do |agent|
    agent.user_agent_alias = 'Mac Safari'
  end

  driver
end

Capybara.configure do |config|
  config.run_server = false
  config.app_host = "http://my_vm_domain.com"
  config.javascript_driver = :poltergeist
  config.default_driver = :mechanize
  config.default_max_wait_time = 10 # default is 2
end

Пример провала теста (не провал, но получение Capybara::Poltergeist::TimeoutError:):

require 'rails_helper'

feature 'agente visualiza estoques de um passeio', js: true do

  scenario 'com sucesso' do

    agente_log_in

    visit '/roteiro/show/723'

    find(:partial_href, 'new_passeio/723').click

    select 'Passeio Teste', from: 'passeio_produto'
    fill_in 'passeio_data', with: '11/11/2017'

    within('button#estoque_controls_0') do

      within('div#estoque_0_hora') do
        expect(page).to have_content('07:30')
      end

      within('span#estoque_0_vagas') do
        expect(page).to have_content('3')
      end

    end

    within('button#estoque_controls_1') do

      within('div#estoque_1_hora') do
        expect(page).to have_content('10:00')
      end

      within('span#estoque_1_vagas') do
        expect(page).to have_content('5')
      end

    end

  end

end

Код из agente_log_in.rb в папке поддержки:

def agente_log_in

  Capybara.app_host = "http://my_vm_domain.com"

  visit '/usuario/logout'
  visit '/'

  fill_in 'data[AdmUsuario][usuario]', with: 'agente'
  fill_in 'data[AdmUsuario][senha]', with: 'pa$$w0rd'

  click_on 'Entrar'

end

Код для этого :partial_href найти:

module Selectors

  Capybara.add_selector(:partial_href) do
    xpath {|href| XPath.descendant[XPath.attr(:href).contains(href)] }
  end

end

Все в порядке с другими тестами, которые находятся в других папках приложения. Они также в порядке, если я запускаю тесты в этой папке по отдельности. Кажется, проблема возникает только тогда, когда я запускаю ЭТУ конкретную папку в целом.

1 Ответ

0 голосов
/ 01 мая 2018

После включения дополнительной информации, запрошенной Томасом Уолполом, я продолжил поиск и изучение возможностей.

В конце концов я столкнулся с проблемой poltergeist # 781 на GitHub , которая описывает ситуацию, очень похожую на мою, и в итоге представляет решение wait_for_ajax .

Прежде чем реализовать его в своем проекте, я прочитал больше об ожидании Ajax и нашел этот пост тоже очень полезным.

В конце концов, я выбрал код jasonfb из GitHub, потому что он показался мне более подробным и информативным.

Это сработало как шарм! Мои тесты сейчас проходят последовательно. Мне даже удалось удалить настройки для :timeout и default_max_wait_time.

Приложение CakePHP, о котором идет речь, очень тяжелое, и специфическая часть, которую тестирует эта папка, особенно полна запросов Ajax.

...