Pact 框架实战指南 Pact 是目前最流行的契约测试框架,特别适合 Java 微服务生态。它分为消费者测试和提供者测试两部分。 Pact 支持多种语言和框架,生态完善,配套有 Pact Broker 用于集中管理契约文件和版本兼容性。 Pact Broker 生态连接 Broker 作为契约管理中心,存储所有契约并跟踪版本兼容性。 消费者在 CI 中发布契约: mvn pact:publish \ -Dpact.broker.url=https://pact-broker.yourcompany.com \ -Dpact.consumer.version • 统一管理契约文件:使用 Pact Broker 等工具集中存储和管理契约,便于版本追踪和兼容性检查。
image window is active to change descriptor"; } static String Legende(SimpleBlobDetector::Params &pAct <const ostringstream&>(ostringstream() << pAct.minArea).str(); String sup = static_cast<const ostringstream&>(ostringstream() << pAct.maxArea).str(); s = " Area range [" + inf + " to " <const ostringstream&>(ostringstream() << pAct.minCircularity).str(); String sup = static_cast ) { String inf = static_cast<const ostringstream&>(ostringstream() << (int)pAct.blobColor
Pact中的一些基本概念: Contract: 契约文件,在Pact中也叫做pact,可以保存在本地,也可存在broker中 Provider: 真正运行的生产者服务 Consumer: 接收生产者发出的数据 在pact中,consumer和provider分别做了不同的事: Consumer端: consumer端会做这么几件事: 首先使用pact dsl定义它消费的接口的request和response ,并注册到mock server中 然后consumer端的测试会发送一个真实的请求到pact起的一个本地的mock server 接着pact会去对比实际的request和expected request Pact broker是pact提供的一个专门用来统一管理契约的一个服务,在这个服务中,开发者们可以清晰的看到所有的服务提供者和消费者的详细信息。 返回给pact,接着pact会拿着这个response去和pact broker上获取到之前consumer定义的契约并进行比对,如果provider能够满足契约,则验证通过。
) { ostringstream ss; ss << "Area[" << pAct.minArea << "," << pAct.maxArea << "] "; ss << "del. [" << pAct.delta << "] "; ss << "var. [" << pAct.maxVariation << "] "; ss << "div. [" << (int)pAct.minDiversity << "] "; ss << "pas. [" << (int)pAct.pass2Only << "] "; ss << "RGb- >evo. [" << pAct.maxEvolution << "] "; ss << "are. [" << (int)pAct.areaThreshold << "] "; ss << "mar. [" << (int)pAct.minMargin << "] "; ss << "siz. [" << pAct.edgeBlurSize << "]"; return
6、契约文件生成后,我们可以将其保存在文件系统或者Pact-Broker(Pact提供的中间件,用来管理契约文件)中,以便后续提供者使用。 6、验证提供者的响应结果与Pact契约文件定义的契约中是否一致。 9.3 Pact 特性 传统情况下做集成测试需要把服务消费者和服务提供者两个服务都启动起来再进行测试,而Pact做契约测试时将它分成两步来做,每一步里面都不需要同时启动两个服务。 4、Pact提供的Pact Broker 可以自动生成一个服务调用关系图,为团队提供了全局的服务依赖关系图。 5、Pact提供Pact Broker这个工具来完成契约文件管理,使用Pact Broker后,契约上传与验证都可以通过命令完成,且契约文件可以制定版本。
下图为该模型的图像处理结果: 二、Pact-Net 核心设计拆解:从输入到输出,每一步都藏着巧思 Pact-Net 的整体架构其实很清晰,其实就是一条 "特征提取→特征融合→结果输出" Pact-Net 在三大任务中表现封神 讲完了模型设计,咱们最关心的肯定是:Pact-Net 到底有多厉害?论文在三个医学图像分割任务上做了实验:皮肤病变分割、息肉分割、细胞分割。 再看 ISIC 2016 和 ISIC 2017 数据集: ISIC 2016:Pact-Net 的 T-JAC 达到 84.06%,比第二名高 2.93 个百分点; ISIC 2017:Pact-Net 五、Pact-Net 的局限性与未来方向 虽然 Pact-Net 的性能很惊艳,但它也不是完美的。 如果你对 Pact-Net 感兴趣,强烈建议去读一下原文(论文标题:Pact-Net: Parallel CNNs and Transformers for medical image segmentation
当今比较主流的CDC测试框架有PACT(https://github.com/pact-foundation/pact-specification) cdc核心原则(转自:https://www.cnblogs.com Pact的契约测试流程 ? 如上图,使用Pact完成契约测试后,首先我们还是按照原来的测试用例对Consumer进行测试,在需要Consumer和Provider发生交互的时候,Provider被替换成和Pact交互。 在测试过程中,Pact会记录下全部的Provider的调用请求(保存在一个Json文件中),这就是消费者的契约。 Pact官方给出的几个场景: (转自: https://insights.thoughtworks.cn/about-contract-test/) 适用场景: 团队能把控开发过程中的Consumer和
); } json { "nodes": [ { "id": 1, "type": "Source: Collection Source", "pact Collection Source", "parallelism": 1 }, { "id": 2, "type": "Flat Map", "pact ": "second" } ] }, { "id": 4, "type": "Keyed Aggregation", "pact Out", "pact": "Data Sink", "contents": "Sink: Print to Std.
二、契约测试消费者驱动契约(CDC):通过Pact等工具定义接口契约,确保双方遵守约定。 javascript// Pact示例:定义消费者期望const { Pact } = require('@pact-foundation/pact');const provider = new Pact
PACT: PARAMETERIZED CLIPPING ACTIVATION FOR QUANTIZED NEURAL NETWORKS(2018)提出了PACT方法,让模型动态学习量化的clipping 下图是之前的PACT、LSQ等量化压缩方法随着压缩后的bit减少困惑度的变化。可以看到压缩到2-bit时出现非常明显的效果折损。 为什么之前的量化压缩方法应用到预训练语言模型上效果会这么差的? 可以看到,PACT、LSQ等量化方法在应用到预训练语言模型后,embedding容易形成簇,也就是embedding之间差异性减弱。从下面的cosine相似度也能看出同样的问题。 这对于确定合适的clipping阈值非常困难,即使自动学习clipping阈值的PACT模型也很难优化。 6 总结 本文以ACL 2022杰出论文——量化压缩预训练语言模型为出发点,首先介绍了经典的量化压缩方法,包括BinaryConnect、PACT等,又进一步介绍了在BERT上的量化压缩工作。
当今比较主流的契约测试框架是Pact,其工作原理如图5-1所示。 图5-1 Pact的工作原理 使用Pact完成契约测试后,先按照原来的测试用例对消费者(comsumer)进行测试,在需要消费者和生产者(provider)交互时,使生产者与Pact交互。 在测试过程中,Pact会记录全部生产者调用请求(保存在一个JSON文件中),这就是消费者的契约。 在执行生产者的测试时,无须重新完成生产者的测试用例,只需要以Pact记录下来的消费者契约作为测试的输入,完成与生产者的交互,来验证生产者是否满足消费者契约。 如果团队不仅能自主把控开发过程中的消费者和提供者并推动消费者驱动开发的实施,还可以管理每个独立的消费者端的提供者端需求,那么适合使用Pact这类契约测试实践。
(pobs, dtype=np.float32).reshape(1, -1)) pact = np.argmax(pact.data) # act (pact) obs, reward, done, profit = train_env.step(pact) train_rewards.append (pact) deep_hub_obs, reward, done, profit = test_env.step(pact) test_rewards.append pobs, dtype=np.float32).reshape(1, -1)) pact = np.argmax(pact.data) # act pobs, dtype=np.float32).reshape(1, -1)) pact = np.argmax(pact.data) # act
也就是说,PACT 会整体考虑所有输出神经元并更改 α 参数。所得到的 PACT 的训练和验证误差如图 3 所示。可以看到,PACT 的误差会收敛到使用常规 ReLU 的网络的误差。 ? 图 3:使用 PACT 的 CIFAR10 ResNet20 的训练误差(a)和验证误差(b)。注意,PACT 的收敛曲线紧随 ReLU。 当同时部署了 PACT 和 SAWB 时,PACT-SAWB 能在各种变体的 CIFAR10 ResNet 上保证 3% 以内的准确度损失。 注意,我们之前讨论的 PACT-SAWB 和 PACT-SAWB-fpsc 之间有些许不同。 PACT-SAWB-fpsc 是指带有全精度快捷连接(full-precision shortcut connections)的 PACT-SAWB。
对于CDC,有一个非常好的框架,可用于多平台:Pact。 通过Pact,我们可以定义我们的消费者契约文件,并根据微服务接口的提供者和消费者进行验证。 我建议花几分钟阅读官方Pact网站的主页,这很好地诠释了它背后的道理。 正如我所说的,Pact适用于很多平台,在我们的例子中,用Scala编写Consumer和Producer,我们只能使用一个实现:Scala-Pact。 你可以找到它们,它们是遵循特定Pact结构的JSON文件。 更多关于CDC和Pact 我已经向你展示了Pact的最基本用法,对于一个真正的环境来说这可能是不够的,因为有许多团队,每个团队都与许多生产者和消费者进行“并发”工作,其中通信非常重要,以及自动化和用于解决它的工具
我们将使用一个名为Pact的项目[47],一种无视编程语言的文档格式,来指定服务之间的契约(重点是用户驱动契约)。据我所知,澳大利亚一家名为DiUS的科技公司[48]在不久前启动了Pact项目。 ? [51]允许我们将pact - JVM - JUnit[52]模块连接到我们最熟悉的测试框架中(即本例中的JUnit)。 如果这个测试成功运行,我们将在目标构建目录中生成这个Pact契约。(在本文例子中,它会出现./target/pacts中。) /pact-specification [48] https://twitter.com/dius_au [49] https://docs.pact.io/documentation/ [50] https [52]https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-junit [53、55] http://arquillian.org
以CDCT测试框架PACT为例。 服务消费者通过建立模拟提供者的Mock,可以对请求、响应和相关信息记录下来,成为一个Pact文件。这个文件就是消费者与提供者之间的契约。 主流框架介绍 能够完成CDCT任务的框架有Janus\Pact\Pacto\Spring Cloud Contract等,网上可以找到比较多资料的是PACT和Spring Cloud Contract PACT (https://docs.pact.io/) 其官网的说明是这样的: PACT是一种契约测试工具。契约测试是一种确保服务(例如API提供程序和客户端)能够相互通信的方法。 Pact Broker等。 Pact的用户已经遍及包括RedHat、IBM、Accenture等在内的若干知名公司,Pact已经是事实上的契约测试方面的业界标准。
对于CDC,有一个非常好的框架,可用于多平台:Pact。 通过Pact,我们可以定义我们的消费者契约文件,并根据微服务接口的提供者和消费者进行验证。 我建议花几分钟阅读官方Pact网站的主页,这很好地诠释了它背后的道理。 正如我所说的,Pact适用于很多平台,在我们的例子中,用Scala编写Consumer和Producer,我们只能使用一个实现:Scala-Pact。 我们也可以尝试执行Pact test(MyLibraryClientPactSpec),但它会失败,因为它应该执行一个真正的HTTP调用,scala-pact框架将启动一个真实的HTTP服务器,接受和响应协议中描述的请求 你可以找到它们,它们是遵循特定Pact结构的JSON文件。
结果发现,开发同学通过注解的方式、使用Pact的state功能对契约文件中定义的每一个交互分别进行了对应响应的实现。 我们先来回顾一下契约测试在生产者端的一般实践方式,如下图所示,Pact从Pact Broker拉取契约文件(或者直接读取本地的契约文件),然后从契约文件中提取交互中的请求发送给生产者服务,生产者服务根据请求返回对应的响应 ,Pact再将生产者返回的真实响应与契约文件中定义的期望响应进行对比,得出测试结果。 而Pact提供的state方式,恰恰是一种侵入式的测试方式。 而当我们抛开Pact这个工具,使用类似RestAssured这样的工具来实现类似的“多套”API自动化测试时,我们达到的效果和使用Pact是几乎完全相同的。
2.测试效率对比(横向) 环境依赖: 单元测试:程序集 契约测试:程序集、依赖契约文件、虚拟路由服务 端到端测试:程序集、真实路由服务、前端UI 运行速度: 单元测试 > 契约测试 > 端到端测试 Pact 我们先假设B系统希望A系统提供新功能,如果按照图中黄色步骤来提交的话,则会测试失败,原因在于此时,契约文件是最新的B-A.consumer.1.1.pact与之对应A-B.provider.1.0.jar 然后按照图中步骤3运行,A-B.provider.1.1.jar和B-A.consumer.1.1.pact完美契合,最终又将B-A.consumer.1.1.pact提交到服务器。 构建契约测试类似于单元测试,并且在Pact的框架下十分方便维护。但是,测试框架本身还有一些问题,诸如,大小写敏感,空值验证,只有一份契约文件,契约测试分组等。 (以上是基于pact 1.0的实践,pact2.0使用了正则表达式以及TypeMatching等机制解决了验证“具体”值的问题,更多详细内容请关注pact官方文档) ---- 结语 契约测试不是银弹,它不是替代
lastminute.com 已经使用 Pact(一个客户端驱动的契约测试工具)对微服务之间的 RPC 交互进行了契约测试,并在随后将其扩展到服务间的异步交互(通过 RabbitMQ 代理交换消息)上。 图片来源:https://technology.lastminute.com/contract-testing-asynchronous-messaging-pact-junit-mockk/ eBay 他们对 Spring Cloud Contract 和 Pact 进行了评估,最终选择了后者,因为后者可以更直接地使用 schema,并有更好的跨团队交互支持。 他们对 Spring Cloud Contract 和 Pact 进行了评估,最终选择了后者,因为后者可以更直接地使用 schema,并有更好的跨团队交互支持。 他们对 Pactflow(一款商业版 Pact 产品)和内部 CI/CD 工具进行了无缝集成,并创建了一个专门的开发者门户,用于配置新的契约测试。