我正在尝试向我的团队介绍合同测试,而 Pact 似乎是唯一可靠的工具。
复杂之处在于文档建议将其与微服务一起使用并作为 CI 管道的一部分。但是我们不能对我们的基础设施做出如此大的改变,相反,我尝试修改 Pact 的使用以适应我们的需求。
我想使用 Pact 通过 REST API 测试 JavaScript (Karma + Mocha) 前端和 Rails (Rspec) 后端之间的通信。一切都很好,除了我不能让它在 CI (Circle CI) 上可靠地工作。我们没有 CI 管道,正如 Pact 文档中所建议的那样,我们只想在一个容器中一个接一个地运行 Consumer 和 Provider 测试。并且工件将仅存储在容器中的临时文件夹中,然后将其删除。
问题:是否有任何既定且可靠的方法可以在没有管道的情况下在一个容器中在 CI 上运行 Pact 测试?或者 Pact 将不是这项工作的最佳工具?
我编写了一个 ruby 脚本来完成此操作,但它经常因超时而崩溃:
def test_pact
# wait for pact server to start, identify it by pid in the STDOUT
server_init_message = "WEBrick::HTTPServer#start: pid="
server_error_message = "(Errno::EADDRINUSE)"
read_stream, write_stream = IO.pipe
proc = ChildProcess.build("bundle", "exec", "rake", "pact:server")
proc.io.stdout = proc.io.stderr = write_stream
proc.leader = true # makes sure to kill all child forks of this process when it dies
begin
proc.start
output_line = read_stream.gets
until output_line.include?(server_init_message)
puts "Waiting for Pact server to boot: #{Time.now}"
output_line = read_stream.gets
puts "Server output: #{output_line}"
raise "Server boot error" if output_line.include?(server_error_message)
end
puts "Pact Server is booted"
# Run JS tests:
Dir.chdir("js") do
run_or_exit("./build-support/circle.js", 'contract-karma.conf.js')
end
proc.stop
# Run Ruby tests:
run_or_exit("bundle exec rake pact:verify")
rescue ChildProcess::TimeoutError, RuntimeError
proc.stop
end
end
还有一个 Rake 任务:
require 'pact/tasks'
task :default => 'pact:verify'
# rake pact:server
namespace :pact do
desc 'Run Pact Mock Server'
task server: :environment do
puts 'starting Pact mock server'
system 'pact-mock-service --host localhost --port 1234 --pact_dir spec/contracts --consumer "Some Service" --provider "Some Service Provider" --pact_specification_version 2'
end
end