Rails 시스템 테스트에서 Capybara와 Cuprite로 브라우저 콘솔 로그 캡처하기

Capture Browser Console Logs in Rails System Tests with Capybara and Cuprite · Daniela Baron

작성자
발행일
2025년 09월 02일

핵심 요약

  • 1 Rails 시스템 테스트에서 Capybara와 Cuprite를 사용하여 `StringIO` 로거를 통해 브라우저 콘솔 로그를 효과적으로 캡처할 수 있습니다.
  • 2 이 방법은 JavaScript 중심의 SPA에서 발생하는 간헐적인 오류나 타이밍 문제를 디버깅하는 데 유용하며, 테스트 실행 속도를 저하시키지 않습니다.
  • 3 디버깅을 위해 JavaScript 파일을 수정한 후에는 `bin/rails assets:precompile`을 실행해야 하며, Cuprite 소스 코드 탐색이 문제 해결에 도움이 될 수 있습니다.

도입

Rails 시스템 테스트는 Capybara를 활용하여 사용자 인터랙션을 시뮬레이션하며, JavaScript 기반의 SPA(Single Page Application)를 테스트할 때는 Cuprite와 같은 JavaScript 드라이버가 필수적입니다. 그러나 SPA 테스트 시 코드 상호작용 방식이나 특정 코드의 실행 시점을 파악하기 어려운 경우가 많습니다. 특히 이벤트 처리나 타이밍 문제로 인해 예상치 못한 동작이 발생할 때, 프런트엔드 코드에 `console.log` 문을 추가하는 것이 도움이 되지만, 헤드리스 모드에서 이러한 로그를 어떻게 캡처하고 확인할 수 있는지는 명확하지 않습니다. 이 글은 브라우저 콘솔 로그 캡처의 중요성을 설명하고, Cuprite 드라이버를 구성하여 로그를 캡처하는 방법을 안내합니다.

브라우저 콘솔 로그 캡처의 필요성

시스템 테스트가 간헐적으로 실패하고 JavaScript 실행 문제로 의심되는 시나리오를 가정해 봅시다. 디버깅을 위해 앱에 console.log 문을 추가했지만, 헤드리스 모드에서는 이 로그에 접근하기 어렵습니다. 비-헤드리스 브라우저(예: Chrome)로 테스트를 실행하고 binding.pry와 같은 디버깅 도구를 사용하는 방법도 있지만, 이 방법은 브라우저 속도를 늦춰 타이밍 관련 문제가 발생하지 않을 수 있습니다. 진정한 실패를 재현하려면 테스트를 전체 속도로 실행하면서 브라우저 콘솔 로그를 캡처해야 합니다.

해결책: Cuprite 드라이버 설정

Cuprite 드라이버를 구성하여 브라우저 콘솔 로그를 캡처하는 방법은 다음과 같습니다.

  1. Capybara 드라이버 설정 수정: spec/support/capybara.rb 파일에서 Cuprite 드라이버를 등록할 때 StringIO 로거를 정의하여 콘솔 출력을 캡처합니다. ruby # spec/support/capybara.rb Capybara.register_driver :cuprite do |app| logger = StringIO.new Capybara::Cuprite::Driver.new( app, window_size: [1440, 900], timeout: 5, # other config ... logger: logger # 로거를 전달하여 콘솔 로그 캡처 ) end 이 설정은 테스트 실행 중 모든 브라우저 콘솔 출력을 StringIO 로거에 캡처합니다.

  2. 테스트에서 로거 사용: Cuprite 드라이버가 로그를 캡처하도록 설정되었으므로, 테스트에서 이 로그에 접근할 수 있습니다. ruby # spec/features/some_spec.rb it "Does something" do visit some_path click_button "Some Action" logs = page.driver.browser.options.logger.string puts "BROWSER LOGS CAPTURED FROM TEST: #{logs}" expect(URI.parse(page.current_url).request_uri).to eql("/account") end 페이지 방문 및 JavaScript 동작 트리거 후, logger.string 속성에서 캡처된 로그를 추출하여 출력합니다.

  3. 로그 출력 관리: 캡처된 출력은 console.log 문뿐만 아니라 많은 내부 브라우저 출력을 포함하므로 매우 방대할 수 있습니다. 이를 관리하기 위해 출력을 클립보드로 파이프하거나 텍스트 파일로 리디렉션하여 검사하는 것이 좋습니다. 예를 들어, Mac에서는 bin/rspec spec/features/some_spec.rb | pbcopy 명령을 사용할 수 있습니다. 캡처된 로그는 Runtime.consoleAPICalled를 포함하는 JSON 형식이며, 특정 로그를 필터링하여 확인할 수 있습니다. ruby # spec/features/some_spec.rb it "Does something" do visit some_path click_button "Some Action" logs = page.driver.browser.options.logger.string matching_logs = logs.lines.select { |line| line.include?("=== ROUTER") } puts "FILTERED BROWSER LOGS:" puts matching_logs expect(URI.parse(page.current_url).request_uri).to eql("/account") end

중요 사항: 자산(Asset) 재컴파일

JavaScript 파일을 수정(예: 디버깅을 위해 console.log 추가)한 후에는 반드시 bin/rails assets:precompile 명령을 실행해야 합니다. 그렇지 않으면 테스트 모드에서 Rails는 사전 컴파일된 자산 번들을 사용하므로, 새로운 로그 문이 나타나지 않을 수 있습니다.

Cuprite 소스 코드 탐색

Cuprite 문서에서 명확한 해결책을 찾기 어려울 때, 오픈 소스 프로젝트의 강점을 활용하여 소스 코드와 테스트 스위트를 살펴보는 것이 좋습니다. Cuprite 코드베이스에서 console.log를 검색하여 StringIO 로거를 사용하여 콘솔 로그를 캡처하는 방법을 보여주는 테스트 케이스를 찾을 수 있습니다. 이는 개발자가 의심스러울 때 소스 코드와 테스트를 통해 풍부한 정보를 얻을 수 있다는 교훈을 줍니다.

결론

Capybara와 Cuprite를 사용하여 Rails 시스템 테스트에서 브라우저 콘솔 로그를 캡처하는 것은 테스트 속도를 저하시키지 않으면서 JavaScript 타이밍 문제를 디버깅하는 매우 유용한 방법입니다. 드라이버 설정에 `StringIO` 로거를 포함함으로써 테스트 실행 중 모든 `console.log` 출력을 접근할 수 있습니다. 캡처된 출력은 방대할 수 있으므로, 파일로 리디렉션하거나 테스트 내에서 필터링하는 것이 권장됩니다. 이 접근 방식은 실제 환경과 동일한 조건에서 디버깅할 수 있게 하여, 앱의 JavaScript가 전체 속도 테스트 실행에서도 예상대로 작동하는지 확인할 수 있도록 돕습니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!