0

Capybara를 사용하여 레일에 기능 사양을 작성하는 CircleCI를 사용하는 자동화 된 테스트 빌드 작업 중입니다.Capybara javascript 사양이 너무 많은 메모리를 사용합니다.

문제는 우리가 js: true 플래그를 사용하여 사양을 쓰는 것처럼 보이고, 너무 많은 메모리를 소비하여 circleci 컨테이너에서 4GB 제한을 초과하게하는 것입니다.

디버그 빌드에서 SSH를 활성화하고, 최상위 프로그램을 실행하고, 가장 많은 메모리를 사용하고 있는지 확인했습니다. 루비 프로세스는 3.5GB 이상의 메모리를 소비합니다. 이 기능은 javascript가 활성화 된 사양의 빌드에서만 발생합니다.

누군가가 이전에 본 적이 있거나 이러한 사양의 메모리 사용 공간을 줄이기위한 아이디어가 있는지 궁금합니다.

전체 사양 세트를 로컬에서 실행하면 각 기능 사양에 대한 새 크롬 창이 열리 며 전체 테스트가 끝날 때까지 절대로 닫지 않습니다.

로컬로 실행중인 rspec spec --profile 10은 또한 가장 느린 사양 중 가장 느린 10 가지 사양 중 두 가지 사양만을 보여 주며, 그 중 하나는 10 초 이상 걸리는 가장 느린 속도입니다. 꽤 짧은 사양이기도합니다. 누군가를 기록하고 몇 가지를 클릭합니다.

RSpec.configure do |config| 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.use_transactional_fixtures = true 
    config.infer_base_class_for_anonymous_controllers = false 
    config.order = "random" 

    config.around(:each, :run_jobs_inline => true) do |example| 
    Resque.inline = true 
    example.run 
    Resque.inline = false 
    end 

    config.before(:suite) do 
    DatabaseCleaner[:active_record].strategy = :transaction 
    DatabaseCleaner[:mongo_mapper].strategy = :truncation 
    DatabaseCleaner.clean_with :truncation 
    end 

    config.before(:all) do 
    DeferredGarbageCollection.start 
    end 

    config.after(:all) do 
    DeferredGarbageCollection.reconsider 
    end 


    config.before(:each) do 
    DatabaseCleaner.start 
    Rails.cache.clear 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    Timecop.return 
    end 

    config.filter_run_excluding :ignore => true 

    config.infer_spec_type_from_file_location! 
end 

Capybara.register_driver :chrome do |app| 
    Capybara::Selenium::Driver.new(app, :browser => :chrome) 
end 

Capybara.javascript_driver = :chrome 

Capybara.register_driver :iphone do |app| 
    Capybara::Selenium::Driver.new(app, {browser: :chrome, switches: %w[--user-agent=Mozilla/5.0\ (iPhone;\ CPU\ iPhone\ OS 5_0\ like\ Mac\ OS\ X)\ AppleWebKit/534.46\ (KHTML,\ like\ Gecko)\ Version/5.1 Mobile/9A334 Safari/7534.48.3]}) 
end 

[:iphone, :chrome].each do |capybara_driver| 
    Capybara::Screenshot.register_driver(capybara_driver) do |driver, path| 
    driver.browser.save_screenshot(path) 
    end 
end 
+0

JS 사양은 브라우저를 열고 더 많은 통신 오버 헤드가 발생하고 브라우저에서 작업을 수행하는 데 걸리므로 JS 사양보다 느릴 수 있습니다. 즉, 스펙이 새로운 테스트를 위해 새로운 크롬 창을 여는 경우, 기본적으로 동일한 창을 재사용하므로, 귀하의 Capybara (및 rspec 또는 사용중인 테스트 프레임 워크) 구성을 귀하의 질문에 추가하십시오. –

+0

@ 토마스 수목류 완료. transactional_capybara gem을 사용하고 있는데, 이것이이 구성에서 트랜잭션 픽스처를 사용할 수있는 이유입니다. –

+0

DB 연결을 공유하는 데 Rails <= 5.0 (Rails 5.1에서 고정 될 수 있음)의 가장자리 케이스/제한이 너무 많아서 그만한 가치가 있습니다. (결국 아약스 물건 대기는 Capybara 2.7 이후로 아무것도하지 않습니다.) 그래서 transactional_capybara 테스트 당 하나의 창을 만들지는 않겠지 만 나쁜 생각입니다. 'DatabaseCleaner.clean'을 호출하는 블록에 대해'after' 대신에'append_after'를 사용해야합니다. 왜냐하면 마지막으로 실행해야하기 때문입니다 - 수동으로 Capybara 세션을 만들거나 디폴트 자동 세션 관리를 사용하고 있습니까? –

답변

관련 문제