@vovanmozg

Как заставить команду в тесте rspec выполняться не дожидаясь завершения выполнения предыдущей команды?

Привет,

В rails-приложении есть rspec-тесты с использованием Capybara poltergeist (который использует phantomjs). Фронтэнд на Backbone.js. Некоторые тесты проходят через раз: отладка говорит о том, что нужный контент ещё не прогружен в момент проверки. Если добавить искусственную задержку типа sleep(inspection_time = 1), то тест проходит.

describe 'Direct visit page /#/desk/page/[ID]' do
    before { sign_in user }
    it 'should contain page title' do
      visit "/#/desk/pages/#{page.id}"
      #sleep(inspection_time = 1)
      expect(page).to have_css(".page-detail p.title", :text => page.title)
    end
  end

js-тесты и так долго выполняются, а ненадёжные задержки ещё увеличивают время выполнения. Существует ли хорошее решение для драйвера poltergeist (gem 'poltergeist', '1.6.0')?

Может быть стоит отказаться от poltergeist в пользу, например capybara -webkit?
  • Вопрос задан
  • 651 просмотр
Решения вопроса 1
@bmalets
Могу подсказать на счет нескольки вещей:

1. для "распараллеливания" тестов parallel_tests, (а можно и просто написать рейк-таску, которая будет тесты запускать в разных tty). Также есть guard что бы загружать тестраном несколько процессоров, а не один
2. оптимизация site_prizm, facory_firl, vcr и т.д.
3. тестирование фронт-энда. Драйвер браузера, который Вы используете в смоук-тестах например,
запускает браузер бегает по страницах - настройте его так, что бы он не подтягивал сss и картинки (только html и js)
4. Вы перелогиниваитесь в систему before-хуком перед каждым it. Не надо так :)
Просто переопределите метод, который убивает сессию после окончания каждого it так, что бы он ее не убивал.
тогда не надо будет логиниться - это экономит море времени. Вот это мой пример, правда драйвер селениум (метод резет запускается после каждого степа, я просто его переопределил и закомментировал строки с удалением сессии):

class Capybara::Selenium::Driver < Capybara::Driver::Base
  def reset!
    # Use instance variable directly so we avoid starting the browser just to reset the session
    if @browser
      begin
        #@browser.manage.delete_all_cookies <= cookie deletion is commented out!
      rescue Selenium::WebDriver::Error::UnhandledError => e
        # delete_all_cookies fails when we've previously gone
        # to about:blank, so we rescue this error and do nothing
        # instead.
      end
      @browser.navigate.to('about:blank')
    end
  end
end
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vovanmozg Автор вопроса
Спасибо за советы!

Пока сделали костыль в виде "rspec-retry": для отдельно отмеченных тестов он пробует запустить тест несколько раз и если, например, первый раз тест не прошёл, а второй раз прошёл, то считается пройденным.

Можете показать ваш пример использования site_prizm?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы