01
什么是契约测试
测试是软件流程中非常重要,不可或缺的一个环节。一般的测试分为单元测试,集成测试,端到端的手工测试,这也是构成测试金字塔的三个层级。我们今天将要讨论的话题是契约测试,它是处于单元测试和集成测试中间的一个环节。这三个层级分别测试的场景如下:
-
单元测试:测试单个service
-
集成测试:测试由多个services组成的系统
-
端到端测试:测试从用户到各个外部系统的整个场景
契约测试的作用:
-
测试接口和接口之间的正确性
-
验证服务层提供的数据是否是消费端所需要的
-
将本来需要在集成测试中体现的问题前移,更早的发现问题
-
更快速的验证消费端和提供端之间交互的基本正确性
02
为什么要存在契约测试
首先我们将使用以下示例模型来描述微服务测试背后的概念:
在上面的图中,我们可以看到有两个微服务,通过REST彼此进行通信。第一项服务扮演消费者的角色,第二项扮演提供者的角色。
当需要进行集成测试时,可以通过服务虚拟化来模拟正在与之通信的微服务。这里服务提供者被模拟,在部署消费者服务之前,您希望证明其能正常工作。当运行所有测试均为绿色您认为可以部署您的服务了。
但是,如果您针对生产提供商运行服务,而不是模拟版本,则有可能会失败。在这个例子中,提供者已经改变了数据格式。集成测试无法解决这个问题,因为它们正在针对Provider的过时版本运行。
如何填补测试过程中的这个空白?将引入消费者驱动契约测试的概念。消费者驱动契约测试方法是在消费者和提供者之间定义在它们彼此之间转移的数据格式。通常,合同的格式由消费者定义并与相应的提供商共享。之后,执行测试以验证契约是否相符。CDC测试的先决条件之一是可以与提供商服务团队保持良好的最佳密切沟通,分享这些契约和交流测试结果是实施适当的CDC测试的重要部分。
03
PACT测试框架
PACT是一个开源的CDC测试框架。它提供了广泛的语言支持,如Ruby,Java,Scala,.NET,Javascript,Swift/Objective-C。
PACT的工作原理
消费者作为数据的最终使用者非常清楚、明确的知道需要的什么样格式,什么类型的数据,它将负责创建契约文档(包含结构和格式的json文件),服务提供端将根据消费者端创建的契约文档提供对应格式的数据并返回给消费者,通过契约检查判断如果服务端提供的数据和消费者生成的契约不匹配,将抛出异常并提示给服务提供端。
04