복붙노트

[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. ==============================

    1.이 솔루션은 호세 Valim에 의해 작성되었습니다 - 잘 레일 사회와 레일 핵심 팀의 일원으로 존중. 나는 그가 그것으로 문제가 있다면 그것을 사용하는 것이 좋습니다 의심한다. 나는 개인적으로 어떤 문제가 없었어요.

    이 솔루션은 호세 Valim에 의해 작성되었습니다 - 잘 레일 사회와 레일 핵심 팀의 일원으로 존중. 나는 그가 그것으로 문제가 있다면 그것을 사용하는 것이 좋습니다 의심한다. 나는 개인적으로 어떤 문제가 없었어요.

    그냥 당신이 Spork이 요구를 사용하는 경우 작업에 each_run 블록에있을 것을주의하십시오.

    FWIW - 난 포스트 그레스에 위의 패치 간헐적 인 카피 바라 시험 문제가 있었다. @hsgubert가 나타납니다 이하가 있다는 마이크 Perham 솔루션은 이러한 문제를 해결했다합니다. 지금이 솔루션을 사용하고있다.

  2. ==============================

    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. ==============================

    3.DatabaseCleaner 보석 추가 정보는 "왜"질문이 방법을 응답 :

    DatabaseCleaner 보석 추가 정보는 "왜"질문이 방법을 응답 :

  4. ==============================

    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. ==============================

    5.난 그냥이에 자신을 조금 독서를하고 있었다. 난 당신이 블로그 게시물에 여기에 공유 코드 조각을 발견했다 :

    난 그냥이에 자신을 조금 독서를하고 있었다. 난 당신이 블로그 게시물에 여기에 공유 코드 조각을 발견했다 :

    http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/

    직접 귀하의 질문에 대답하기 위해서는 "비 결정적 오류가 발생할"수있는 데이터베이스 청소기 GitHub의 페이지주의. 나는 바로 가서 그것을 사용하지만 이상한 오류로 실행을 시작하면, 어쩌면이 찾고 시작하기 좋은 장소입니다 것입니다.

  6. ==============================

    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)
    
  7. from https://stackoverflow.com/questions/8774227/why-not-use-shared-activerecord-connections-for-rspec-selenium by cc-by-sa and MIT license