Pact和其它语言一起使用

当使用缺乏原生Pact支持的语言来写服务提供者时,你仍然可以使用通用的Pact提供者端验证工具来验证是否满足契约。

通用Pact提供者验证

下面的设置简化了任何语言的Pact提供者端的验证过程。

特性:

  • 验证发布到Pact Broker的Pact文件
  • 在开发环境验证供测试用的本地Pact*.json文件
  • 安装有Ruby环境以及sane的预先配置的Docker镜像,缺省为src / Rakefile,避免重复
  • 应当会用到的提供者端状态

以下两个解决方案使用Docker镜像和Pact Provider Verifier 的Gem包。对于更高级的用法,你可直接使用Pact Provider Proxy Gem,然而在大多数情况下,Pact Provider Verifier应该能够满足你的需求。

它是如何工作的

步骤:

  1. 创建一个API和对应的Docker镜像
  2. 将pact文件发布至Pact broker(或者创建本地文件)
  3. 启动你的API
  4. 运行Pact Provider Verifier
  5. 停止你的API

验证工具之后会针对你的运行API重放所有的Pact文件,如果无法满足则会失败(exit 1)。
因为没有可用的测试DSL,所以在CI/CD流水线中运行时,你需要注意处理进程的退出代码。

如果你在使用Docker时和Docker compose一起使用,它会帮你自动搞定上面的步骤3-5。

Docker的例子

以下使用Docker镜像的例子来自Pact Provider Verifier项目。
步骤:

  1. 创建一个API和对应的Docker镜像
  2. 将pact文件发布至Pact broker(或者创建本地文件)
  3. 创建一个docker-compose.yml文件,连接你的API和Pact Verifier
  4. 设置下面所需的环境变量:
    • pact_urls - 逗号分隔的pac文件URL列表
    • provider_base_url - pact提供者(比如你的API)的基本url
  5. 运行docker-compose build以及docker-compose up
一个运行在4000端口的Node API的docker-compose.yml例子文件:
  1. api:
  2. build: .
  3. command: npm start
  4. expose:
  5. - "4000:4000"
  6. pactverifier:
  7. image: dius/pact-provider-verifier-docker
  8. links:
  9. - api:api
  10. volumes:
  11. - ./pact/pacts:/tmp/pacts # If you have local Pacts
  12. environment:
  13. - pact_urls=http://pact-host:9292/pacts/provider/MyAPI/consumer/MyConsumer/latest
  14. #- pact_urls=/tmp/pacts/foo-consumer.json # If you have local Pacts
  15. - provider_base_url=http://api:4000

含有提供者状态的API验证

通过实现以下的内容来对提供者端执行Pact验证:

  • 消费者端的一个基于get请求的http接口,它返回契约中的提供者端状态

    1. {
    2. "myConsumer": [
    3. "customer is logged in",
    4. "customer has a million dollars"
    5. ]
    6. }
  • 一个基于post的http接口,用来设置活跃的pact消费者和提供者状态

    1. consumer=web&state=customer%20is%20logged%20in

需要以下环境变量:

  • pact_urls —— 一组由逗号分隔的契约文件URL的列表
  • provider_base_url - 服务 提供者 的基URL
  • provider_states_url - 由消费者提供的能够返回 提供者状态 的完整URL
  • provider_states_active_url - 用来设置契约相关的 消费者 and 提供者 状态的URL

已更新的docker-compose.yml示例文件:

  1. api:
  2. build: .
  3. command: npm start
  4. expose:
  5. - "4000"
  6. pactverifier:
  7. image: dius/pact-provider-verifier-docker
  8. links:
  9. - api
  10. environment:
  11. - pact_urls=http://pact-host:9292/pacts/provider/MyProvider/consumer/myConsumer/latest
  12. - provider_base_url=http://api:4000
  13. - provider_states_url=http://api:4000/provider-states
  14. - provider_states_active_url=http://api:4000/provider-states/active

Ruby示例

如果你没有使用Docker,那么就需要:

  • 安装Ruby运行时环境
  • fork或者clone代码库或者将脚本拷贝至你的工程中
  • 运行下面的命令:
  1. bundle install
  2. bundle exec rake verify_pacts