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应该能够满足你的需求。
它是如何工作的
步骤:
- 创建一个API和对应的Docker镜像
- 将pact文件发布至Pact broker(或者创建本地文件)
- 启动你的API
- 运行Pact Provider Verifier
- 停止你的API
验证工具之后会针对你的运行API重放所有的Pact文件,如果无法满足则会失败(exit 1
)。
因为没有可用的测试DSL,所以在CI/CD流水线中运行时,你需要注意处理进程的退出代码。
如果你在使用Docker时和Docker compose一起使用,它会帮你自动搞定上面的步骤3-5。
Docker的例子
以下使用Docker镜像的例子来自Pact Provider Verifier项目。
步骤:
- 创建一个API和对应的Docker镜像
- 将pact文件发布至Pact broker(或者创建本地文件)
- 创建一个
docker-compose.yml
文件,连接你的API和Pact Verifier - 设置下面所需的环境变量:
pact_urls
- 逗号分隔的pac文件URL列表provider_base_url
- pact提供者(比如你的API)的基本url
- 运行
docker-compose build
以及docker-compose up
一个运行在4000
端口的Node API的docker-compose.yml例子文件:
api:
build: .
command: npm start
expose:
- "4000:4000"
pactverifier:
image: dius/pact-provider-verifier-docker
links:
- api:api
volumes:
- ./pact/pacts:/tmp/pacts # If you have local Pacts
environment:
- pact_urls=http://pact-host:9292/pacts/provider/MyAPI/consumer/MyConsumer/latest
#- pact_urls=/tmp/pacts/foo-consumer.json # If you have local Pacts
- provider_base_url=http://api:4000
含有提供者状态的API验证
通过实现以下的内容来对提供者端执行Pact验证:
消费者端的一个基于get请求的http接口,它返回契约中的提供者端状态
{
"myConsumer": [
"customer is logged in",
"customer has a million dollars"
]
}
一个基于post的http接口,用来设置活跃的pact消费者和提供者状态
consumer=web&state=customer%20is%20logged%20in
需要以下环境变量:
pact_urls
—— 一组由逗号分隔的契约文件URL的列表provider_base_url
- 服务提供者
的基URLprovider_states_url
- 由消费者提供的能够返回提供者状态
的完整URLprovider_states_active_url
- 用来设置契约相关的消费者
and提供者
状态的URL
已更新的docker-compose.yml示例文件:
api:
build: .
command: npm start
expose:
- "4000"
pactverifier:
image: dius/pact-provider-verifier-docker
links:
- api
environment:
- pact_urls=http://pact-host:9292/pacts/provider/MyProvider/consumer/myConsumer/latest
- provider_base_url=http://api:4000
- provider_states_url=http://api:4000/provider-states
- provider_states_active_url=http://api:4000/provider-states/active
Ruby示例
如果你没有使用Docker,那么就需要:
- 安装Ruby运行时环境
- fork或者clone代码库或者将脚本拷贝至你的工程中
- 运行下面的命令:
bundle install
bundle exec rake verify_pacts