如何创建Elasticsearch测试环境来运行我的capybara测试(rails app)

时间:2014-05-06 13:45:50

标签: ruby-on-rails-4 elasticsearch capybara

我的方案

我有一个使用elasticsearch索引某些数据的rails应用程序。

对于我的单元和集成自动化测试,我只是使用FakeWeb模拟elasticsearch,但现在我想编写一些验收测试,我想使用elasticsearch而不嘲笑它。

我的问题

如何运行2个elasticsearch集群(一个用于我的开发环境,一个用于我的测试环境),我不希望集群共享任何数据。我也试图找到一种方式来说“在我的水豚测试中我想使用这个集群”

PS:群集必须位于同一台机器(localhost)

我尝试了什么

  • 在另一个端口运行另一个elasticsearch实例:我无法工作,因为elasticsearch会以某种方式与这个新实例共享数据

  • 复制&粘贴elasticsearch文件夹,更改配置config/elasticsearch.yml:我更改了cluster_name并运行了两个elasticsearch实例,每个文件夹一个,但它们以某种方式共享数据。

任何提示或解决方案都会有所帮助。

1 个答案:

答案 0 :(得分:4)

我一直在使用Elasticsearch::Test::Cluster取得了相当不错的成功。我已经设置了rspec,只需在任何需要ES的测试开始时启动集群,然后在退出时将其拆除。它为测试增加了一些时间,但是在测试期间我永远不必考虑启动一个干净的ES实例。

这样做在规范之间清理实例所以如果你需要对索引的数据进行更多特定的测试,你可能需要构建某种清理步骤,但这对我来说很有用。用于单元测试和集成测试(使用cucumber)。

spec/support/test_es_server.rb

中的

require 'elasticsearch/extensions/test/cluster'
class TestEsServer
  def self.cluster
    Elasticsearch::Extensions::Test::Cluster
  end

  def self.port
    @port ||= URI.parse(Rails.application.config.elasticsearch_url).port
  end

  def self.running?
    cluster.running?(port: self.port)
  end

  def self.start
    if !running?
      puts "Starting elasticsearch cluster on port #{port}"
      cluster.start(port: port, nodes: 1) unless running?
    end
  end

  def self.stop
    puts "Tearing down elastic search cluster on port #{port} if necessary"
    cluster.stop(port: port) if running?
  end
end
spec/support/elasticsearch.rb

中的

require_relative "./test_es_server"

RSpec.configure do |config|
  config.before(:example, elasticsearch: true) do
    begin
      TestEsServer.start
    rescue Exception => ex
      puts "Failed to start Elasticsearch: #{ex}"
    end
  end
end

at_exit do
  begin
    TestEsServer.stop
  rescue Exception => ex
    puts "Failed to stop Elasticsearch: #{ex}"
  end
end
spec/controllers/my_controller_spec.rb

中的

describe MyController, elasticsearch: true do

   ... specs that require elastic search calls go here ...

end