我们知道了什么是契约测试,那么下面的问题就是如何实现契约测试、定义契约文件、为 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

下一步

我们了解了如何实现契约测试,以及如何定义契约文件。

在接下来的章节中,您将了解如何验证契约文件的更多细节。