0

我正在尝试向我的团队介绍合同测试,而 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
4

2 回答 2

2

Pact 与 CircleCI 和其他托管 CI / 构建服务完全兼容。但是,为单个构建存在协议并没有真正意义。

根据您当前的用例,我建议以下内容:

  1. 将 Consumer 和 Provider 测试拆分为单独的 Circle CI 构建。
  2. 设置一个独立的 Pact Broker 来存储协议(例如,托管您自己的 Pact Broker或在http://pact.dius.com.au/上免费获得一个)。
  3. 将您的消费者构建(JS 项目)中的契约发布到您的契约代理。
  4. 在您的 Provider 构建中,确保满足协议,否则构建失败。为此,您可以使用pact_broker-client gem。

在 Consumer 之后直接运行 Provider 构建会在一定程度上降低 Pact 的好处,因为每个服务都应该是可独立部署的。

于 2017-04-14T09:34:48.610 回答
1

当你在它的时候看看业力契约。

于 2017-04-15T07:38:46.540 回答