Pact中文参考指南

Pact是什么

Pact是一个用于实现消费者驱动的契约测试的框架。关于什么是消费者驱动的契约测试,可以参见这篇文章,不再赘述。这里只说明契约测试对于构建复杂软件系统的重要作用。

系统工程里有这样一个规律,线性系统(即复杂性随规模线性增长的系统)的可靠性等于组成它的各个组件的可靠性之乘积。这容易理解,因为整个系统正常工作的条件是必须每个组件都同时正常工作。


线性系统的可靠性

也就是说,如果一个系统由三个可靠性各为90%的组件组成,那么整个系统的可靠性实际只有90%×90%×90%=72.9%,低于任一组件的可靠性。如果一个系统由100个组件组成,每个组件即使能达到99%的可靠性,那么整个系统的可靠性也会降到36.6%左右。

然而,一个复杂软件系统的情形可能更糟,因为软件系统实际上是非线性系统。组成软件系统的各个组件之间有依赖与连接关系,除了要让每个组件正常工作之外,还需要保证各个组件之间的调用正常。如果将每个组件视为一个微服务的话,每个微服务上暴露出的接口不止一个,组件两两之间的连接关系又不止一条。如此算来,在微服务规模不断增长的情况下,系统的复杂度已不止线性增长,因此整个系统的可靠性将会比各组件可靠性的乘积还要更低。

因此,在构建由微服务组成的复杂软件系统时,除了保证每个微服务组件的正确性之外,还必须通过测试验证微服务之间连接的正确性。

Pact框架解决的就是如何测试微服务之间连接正确性的问题。

传统方式下,一般通过集成测试来验证服务之间调用是否正常,这需要将被测的各个组件均部署到环境中,然后再展开测试,且不说这种方式下测试运行得如何之慢,只是把各个服务都部署到同一环境之中这件工作,对于许多经常搭环境的开发者来说,就已经非常繁琐而痛苦了。而且由于多个服务共享同一环境,测试也比较脆弱,很容易挂。

Pact是一个思路精巧、设计优雅的测试框架。它通过将一个笨重的集成测试化为两个可以独立运行的单元测试和接口测试来解决这一问题。两步即可完成:

  • Step 1: 服务消费者端编写单元测试,测试对服务提供者接口的客户端请求类。一运行测试,Pact框架便帮助自动生成json形式的pact文件(契约文件)。pact文件中含有交互的路径、方法、请求参数、请求头与期望响应等信息。

  • Step 2: 单独启动服务提供者(此时并不需要启动服务消费者),利用Pact框架提供的验证命令进行契约验证,基于上一步中生成的pact文件,对服务提供者的接口发送请求并验证实际响应是否与期望响应相符。

这种方式至少有明显的几个好处:

  • 服务测试解耦。两个测试之间唯一的耦合点是pact文件(自动生成),自然实现了服务消费者端与提供者端的测试解耦,再也不需要等待“联调”就能各自展开开发。

  • 消费者驱动。由于契约文件是由服务消费者的单元测试驱动而成的,服务提供者只要能够正确通过契约验证,就能保证满足服务消费者端的需求。这一思想其实与敏捷实践中的测试驱动开发(TDD)有异曲同工之处。

  • 测试前移。越早发现问题,解决问题的成本就越小。由于Pact测试已经足够轻量化,开发者甚至在本地开发阶段就可以进行相关的测试,而不需要等到集成阶段才暴露问题。

Pact的前世今生

Pact是一个开源框架,最早是由澳洲最大的房地产信息提供商REA Group的开发者及咨询师们共同创造。REA Group的开发团队很早便在项目中使用了微服务架构,并在团队中对于敏捷和测试的重要性早已形成共识,因此设计出这样的优秀框架并应用于日常工作中也是十分自然。

Pact工具于2013年开始开源,发展到今天已然形成了一个小的生态圈,包括各种语言(Ruby/Java/.NET/JavaScript/Go/Scala/Groovy...)下的Pact实现,契约文件共享工具Pact Broker等。Pact的用户已经遍及包括RedHat、IBM、Accenture等在内的若干知名公司,Pact已经是事实上的契约测试方面的业界标准。

Pact中文参考指南

虽然在国外的许多互联网开发团队中,Pact已经得到了广泛应用,但是由于英语水平的限制和交流的问题,国内许多团队对Pact还知之甚少,对于具体使用时应该遵循怎样的原则和实践更是缺乏足够的了解。

因此我们得到Pact作者们的允许,基于Pact的官方文档,翻译出了这份《Pact中文参考指南》,帮助国内开发者们了解和使用这一优秀框架。欢迎大家参考和提出修正意见

我们是谁,为什么要做这个

我们是一个虚拟的团队:Cloud Native User Group,主要关注云原生应用、DevOps、持续交付等方面的技术与实践,以及探讨如何帮助传统业务在云计算时代下实现云原生转型。

我们致力于为国内开发者团队引入业界最新的软件工程模式、技术与工具,帮助消除因语言而造成的鸿沟。我们相信技术的沟通是无国界的,希望巴比伦塔在今天不再仅是传说。

怎样访问《Pact中文参考指南》

更多关于Pact测试相关的介绍,请关注我在8月19日DevOpsDays上海站的演讲:《轻量化微服务测试实践》

Enjoy! :)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容