什么是合约测试(Contract Test)?
合约测试是一种测试两个应用程序之间交互(如HTTP request/response, Kafka message pubsub)的方法。它允许您定义两个应用程序之间的合约,该合约规定它们应如何交互。然后,可以使用此合约单独测试两个系统,而无需进行完整的集成测试。
An integration contract test is a test at the boundary of an external service verifying that it meets the contract expected by a consuming service — Martin Fowler
通过合约测试,您既能获得单元测试的简单性和速度,又能显著提高覆盖率,使其更接近集成测试的水平,但不会带来相关的复杂性或开销。
为什么需要合约测试?
在现代软件开发中,微服务架构和分布式系统越来越普遍。在微服务或分布式架构中,一个服务常常需要与多个其他服务进行交互。如果其中一个服务的接口发生了变化,可能会影响到与其交互的所有其他服务。集成测试或端到端测试通常对测试环境依赖性高,然而测试环境往往是被多个服务共享的,经常出现不稳定问题,测试环境的搭建和维护也是昂贵且耗时,而且集成测试和端到端测试的执行耗时较久,在服务迭代较快时,只执行change相关的交互点高效且便宜,更有性价比。在这样的背景下,合约测试应运而生。下列表格给出各种测试在复杂度、速度和覆盖率方面的对比。
如何构建和执行合约测试?
目前PACT是最流行的用于合约测试的开源工具,支持包括Java、python、JavaScript等等多语言。不仅支持REST API的服务交互,也支持其他方式的交互如Kafka。详见下列文档。
PACT Contract Testing - Because Not Everything Needs Full Integration Tests - ISE Developer Blog