我们知道了什么是契约测试,那么下面的问题就是如何实现契约测试、定义契约文件、为 API 生成契约测试脚本以及运行测试?
契约测试是由消费者驱动的,因此我们需要从消费者端开始实现契约测试。
这里我们使用 Pact.io 的规范来进行具体实现,Pact.io 支持多种编程语言(.Net、Ruby、Python、PHP),在本节中,我们使用Python作为编程语言。
实现消费者契约测试
安装依赖库
Copy to Clipboard
如下样例代码演示的是一个外部服务 API(提供者),消费者可以使用接口/users/,来获取某一特定用户的信息。
Copy to Clipboard
那么契约测试的代码如下:
Copy to Clipboard
代码中实现了以下逻辑:
- 定义了描述产品和服务的使用者和提供者对象
- 使用 given 语法描述提供者满足的条件
- 定义了消费者预期发起的请求内容
- 定义了服务器应如何响应
代码中使用 Pact 对象作为上下文管理器,被调用的方法将会与 Pact Mock 服务通信。模拟服务将使用代码中定义的条件进行请求,并断言该方法的返回值是否满足预期值。可以使用 setup 和 verify 方法为 Mock 服务配置额外的逻辑:
Copy to Clipboard
在定义代码预期发出的 HTTP 请求时,可以指定方法、路径、正文、头信息和请求内容。可以为预期的请求定义精确的值,也可以使用匹配器来处理动态数据。
Mock服务提供了几个重要功能:
- 提供了一个真实的 HTTP 服务器,代码可以在测试期间与该服务通信,并返回定义的响应体
- 服务将会基于你提供代码,断言实际请求的内容是否匹配
- 如果发出的请求与定义的请求不匹配,将返回详细信息的错误
- 服务将会把契约文件存储为 JSON 文件,可以用于版本控制
契约条件匹配
如果用户信息总是静态的,那么上面的测试代码非常有效,但是如果其中有动态数据或者使用上一个请求的更新字段,那该怎么编写契约匹配条件呢?这里介绍3个常用的匹配器:
Term
断言给定数据应匹配正则表达式,例如匹配数据中包含特定格式的时间戳:
Copy to Clipboard
Like
断言数据的类型匹配,例如:
Copy to Clipboard
EachLike
断言该值是一个数组类型,由传入的元素组成。它可用于断言简单数组:
Copy to Clipboard
下一步
我们了解了如何实现契约测试,以及如何定义契约文件。
在接下来的章节中,您将了解如何验证契约文件的更多细节。