[RUBY-ON-RAILS] 왜 RSpec에 + 셀레늄에 대한 공유 액티브 연결을 사용할 수 있습니까?
RUBY-ON-RAILS왜 RSpec에 + 셀레늄에 대한 공유 액티브 연결을 사용할 수 있습니까?
그것은 셀레늄 및 테스트 트랜잭션 비품을 사용하여 다음 시험 / 시나리오 사이 database_cleaner 같은 것을 사용하지 않도록하는 것입니다 다루는 가장 일반적으로 받아 들여지는 방법을 보인다. 최근 다음을 수행 제안은 다음 문서에 달렸다 :
spec_helper.rb
class ActiveRecord::Base
mattr_accessor :shared_connection
@@shared_connection = nil
def self.connection
@@shared_connection || retrieve_connection
end
end
# Forces all threads to share the same connection. This works on
# Capybara because it starts the web server in a thread.
ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
이 대안에 비해 성능을 위해 더 나은 부하를 보인다. 사람이 사용할 수 없습니다 어떤 이유가 있습니까?
해결법
-
==============================
1.이 솔루션은 호세 Valim에 의해 작성되었습니다 - 잘 레일 사회와 레일 핵심 팀의 일원으로 존중. 나는 그가 그것으로 문제가 있다면 그것을 사용하는 것이 좋습니다 의심한다. 나는 개인적으로 어떤 문제가 없었어요.
이 솔루션은 호세 Valim에 의해 작성되었습니다 - 잘 레일 사회와 레일 핵심 팀의 일원으로 존중. 나는 그가 그것으로 문제가 있다면 그것을 사용하는 것이 좋습니다 의심한다. 나는 개인적으로 어떤 문제가 없었어요.
그냥 당신이 Spork이 요구를 사용하는 경우 작업에 each_run 블록에있을 것을주의하십시오.
FWIW - 난 포스트 그레스에 위의 패치 간헐적 인 카피 바라 시험 문제가 있었다. @hsgubert가 나타납니다 이하가 있다는 마이크 Perham 솔루션은 이러한 문제를 해결했다합니다. 지금이 솔루션을 사용하고있다.
-
==============================
2.사실 그것으로 문제가 있습니다. 당신이 보석 mysql2를 사용하는 경우, 예를 들어, 당신은 같은 몇 가지 오류를보고 시작합니다 :
사실 그것으로 문제가 있습니다. 당신이 보석 mysql2를 사용하는 경우, 예를 들어, 당신은 같은 몇 가지 오류를보고 시작합니다 :
Mysql2::Error This connection is still waiting for a result
대신 사용하십시오. 그것은 마이크 Perham, 그에게 모든 크레딧에 의해 작성되었습니다.
class ActiveRecord::Base mattr_accessor :shared_connection @@shared_connection = nil def self.connection @@shared_connection || ConnectionPool::Wrapper.new(:size => 1) { retrieve_connection } end end ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
당신은 너무 보석 connection_pool을 설치해야합니다. 이것은 많은 두통을 아끼지 않습니다.
-
==============================
3.DatabaseCleaner 보석 추가 정보는 "왜"질문이 방법을 응답 :
DatabaseCleaner 보석 추가 정보는 "왜"질문이 방법을 응답 :
-
==============================
4.난 당신이 내 spec_helper.rb 파일에 언급 된 코드를 사용하여 문제가 발생했습니다.
난 당신이 내 spec_helper.rb 파일에 언급 된 코드를 사용하여 문제가 발생했습니다.
당신의 검사 결과가 여러 데이터베이스에 연결을 사용하는 것에 의존하면 어떻게됩니까? 나는 내 테스트를 실행할 때에 연결해야하는 두 개의 데이터베이스가 있습니다. 내가 설정 데이터베이스 연결에 무슨 일이 벌어지고 있는지 확인하는 간단한 테스트를했다.
class ActiveRecord::Base mattr_accessor :shared_connection @@shared_connection = nil def self.connection @@shared_connection || retrieve_connection end end # Forces all threads to share the same connection. This works on # Capybara because it starts the web server in a thread. puts "First Record cxn: #{FirstDatabase::Record.connection}" # => First Record cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xe59b524> puts "AR Base cxn: #{ActiveRecord::Base.connection}" # => AR Base cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c> ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection puts "First Record cxn: #{FirstDatabase::Record.connection}" # => First Record cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c> puts "AR Base cxn: #{ActiveRecord::Base.connection}" # => AR Base cxn: #<ActiveRecord::ConnectionAdapters::Mysql2Adapter:0xc52761c>
당신이 볼 수 있듯이 내가 공유 연결 방법을 호출하기 전에, 나는 두 개의 서로 다른 데이터베이스 연결을 가지고있다. 후, 공유 연결 메소드 호출, 나는 하나 있습니다.
실패 정보를 검색 할 두 번째 데이터베이스 연결에 갈 필요로하는 시험 그래서. :(
나는이 문제를 게시가는 사람이 솔루션에 도착했습니다 있는지 확인하고 있습니다.
-
==============================
5.난 그냥이에 자신을 조금 독서를하고 있었다. 난 당신이 블로그 게시물에 여기에 공유 코드 조각을 발견했다 :
난 그냥이에 자신을 조금 독서를하고 있었다. 난 당신이 블로그 게시물에 여기에 공유 코드 조각을 발견했다 :
http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
직접 귀하의 질문에 대답하기 위해서는 "비 결정적 오류가 발생할"수있는 데이터베이스 청소기 GitHub의 페이지주의. 나는 바로 가서 그것을 사용하지만 이상한 오류로 실행을 시작하면, 어쩌면이 찾고 시작하기 좋은 장소입니다 것입니다.
-
==============================
6.이 게시물의 끝에 좋은 일이있다. 나는 매우 간단한 스레딩 스크립트에 시도 할 때 나는 MALLOC 오류가 발생 이유를 설명 할 수있다.
이 게시물의 끝에 좋은 일이있다. 나는 매우 간단한 스레딩 스크립트에 시도 할 때 나는 MALLOC 오류가 발생 이유를 설명 할 수있다.
http://apidock.com/rails/ActiveRecord/Base/connection
leente - March 15, 2011 0 thanks Don't cache it! Don’t store a connection in a variable, because another thread might try to use it when it’s already checked back in into the connection pool. See: ActiveRecord::ConnectionAdapters::ConnectionPool connection = ActiveRecord::Base.connection threads = (1..100).map do Thread.new do begin 10.times do connection.execute("SELECT SLEEP(1)") # WRONG ActiveRecord::Base.connection.execute("SELECT SLEEP(1)") # CORRECT end puts "success" rescue => e puts e.message end end end threads.each(&:join)
from https://stackoverflow.com/questions/8774227/why-not-use-shared-activerecord-connections-for-rspec-selenium by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] 지역 레일 개발 환경에서 실제 IP 주소를 가져옵니다 (0) | 2020.02.23 |
---|---|
[RUBY-ON-RAILS] 언제 레일에 서버를 다시 시작해야합니까? (0) | 2020.02.23 |
[RUBY-ON-RAILS] 레일의 보석에서 모듈 방식을 재정의 (0) | 2020.02.23 |
[RUBY-ON-RAILS] 서버 빈 / 레일 레일 : 6 : 경고 : 이미 초기화 일정 APP_PATH 오류 (0) | 2020.02.23 |
[RUBY-ON-RAILS] 보석 'uglifier'을로드하는 동안 오류가 발생했습니다. (Bundler를 :: GemRequireError) (0) | 2020.02.23 |