我的方案
我有一个使用elasticsearch索引某些数据的rails应用程序。
对于我的单元和集成自动化测试,我只是使用FakeWeb模拟elasticsearch,但现在我想编写一些验收测试,我想使用elasticsearch而不嘲笑它。
我的问题
如何运行2个elasticsearch集群(一个用于我的开发环境,一个用于我的测试环境),我不希望集群共享任何数据。我也试图找到一种方式来说“在我的水豚测试中我想使用这个集群”
PS:群集必须位于同一台机器(localhost)
我尝试了什么
在另一个端口运行另一个elasticsearch实例:我无法工作,因为elasticsearch会以某种方式与这个新实例共享数据
复制&粘贴elasticsearch文件夹,更改配置config/elasticsearch.yml
:我更改了cluster_name
并运行了两个elasticsearch实例,每个文件夹一个,但它们以某种方式共享数据。
任何提示或解决方案都会有所帮助。
答案 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