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实例,每个实例一个,但是它们以某种方式共享数据。
任何提示或解决方案都将有所帮助。
我一直在使用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)
| 归档时间: |
|
| 查看次数: |
1268 次 |
| 最近记录: |