如何创建一个Elasticsearch测试环境以运行我的水豚测试(rails app)

Ped*_*ede 1 capybara elasticsearch ruby-on-rails-4

我的情况

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

对于我的单元和集成自动化测试,我只是使用FakeWeb模拟了Elasticsearch,但现在我想编写一些验收测试,并且我想在不模拟它的情况下使用elasticsearch。

我的问题

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

PS:群集必须位于同一台计算机(本地主机)中

我尝试过的

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

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

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

mr *_*ers 5

我一直在使用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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

spec/controllers/my_controller_spec.rb

describe MyController, elasticsearch: true do

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

end
Run Code Online (Sandbox Code Playgroud)