问题标签 [pact-java]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 使用 Pact 和 JUnit 测试 SSL 安全 API
我正在尝试在我们的两个服务器系统之间实现 pact 测试,但不幸的是,我正在努力实现消费者测试:我包含了 pact-jvm-consumer-junit_2.11 工件并使用@Rule 创建了这样的提供:
不幸的是(至少对于测试而言)我们的客户端被硬编码为使用 SSL 连接。因此,我们的测试失败了,因为 pact 服务器不允许 SSL 连接。有没有办法告诉 pact 这样做或解决这个问题而无需设置外部反向代理服务器?
java - pact-jvm-consumer-specs2 - 缺失:[错误] 方法:GET
我对使用 sbt 运行的 spec2 消费者的 Pact JVM 有问题。- 有什么问题?- 我不生成任何协议文件。
给定:
具有依赖项的 sbt 项目
“au.com.dius”%%“pact-jvm-consumer-specs2”%“3.2.11”
“org.specs2” %% “specs2-junit” % “3.3.1”
我有规格类:
当我使用 sbt test 运行时,我得到:
java - Pact 提供者测试的范围应该是什么?
大约半年前,我的组织开始使用 Pact 来创建/验证用 Java 编写的 REST 服务/微服务之间的合同。我们很难决定提供商测试的适当范围或掌握程度,并且希望从其他协议用户的经验中获得一些输入。
基本上,讨论围绕在提供者测试中模拟/存根的位置展开。在服务中,您至少必须模拟对其他服务的外部调用,但您也可以选择模拟更接近 REST 资源类。
我们将其归结为两个选项:
1.第一个选项是提供者测试应该是一个严格的契约测试,并且只使用提供者服务的 REST 资源类,模拟/存根从那里使用的服务类/编排器等。该合同测试将通过组件测试进行扩充,这些组件测试将测试由供应商测试存根/模拟的部分。
2.第二种选择是使用提供者测试作为组件测试,为每个请求执行整个服务组件。只有对其他组件的传递外部调用才会被模拟/存根。
这些是专业人士对每个选项的想法
选项 1 的专业人士:
- 测试将更易于实施,并且占用空间更小
=> 更高程度的隔离。 - 无论如何,我们可能需要其他组件测试来涵盖通常未包含在消费者期望中的用例(错误流等)。这样我们就不会在一个包中混合不同类型的组件测试(Pact 和其他),从而使测试套件更易于理解。
选项 2 的专业人士:
- 测试正在执行更多“真实”代码=>由于不良模拟/存根导致测试错误的风险降低。
我真的很想听听您的提供商测试在这方面的典型表现。有最佳实践吗?
澄清我们所说的“组件”是什么意思:一个组件是一个微服务或一个更大的服务应用程序中的一个模块。我们从 Martin Fowlers http://martinfowler.com/articles/microservice-testing/中获取了“组件”的定义。
提供者服务/组件通常在 Jersey 资源类中具有 REST 端点。此端点是 Pact 提供者测试的提供者端点。一个例子:
在上面的示例中,@Autowired(我们使用 spring)CustomerOrchestrator 可以在运行提供程序测试时被模拟,或者您可以注入真正的“Impl”类。如果您选择注入真正的“CustomerOrchestratorImpl.class”,它将具有额外的 @Autowired bean 依赖项,而这些依赖项又可能具有其他...一个 REST 客户端,它将对其他下游服务/组件执行 HTTP 调用。
如果我们在上面的示例中采用我的“选项 1”解决方案,我们将模拟 CustomerResource 中的 customerOrchestrator 字段,如果我们采用“选项 2”,我们将为 CustomerResource 中的每个依赖项注入 Impl 类(真正的类)依赖图并创建模拟数据库条目和模拟下游服务。
作为旁注,我应该提到我们很少在提供者测试中实际使用真实的数据库。在我们采用“选项 2”的情况下,我们模拟了 DAO 类层,而不是模拟实际的数据库数据,以减少测试中移动部件的数量。
我们创建了一个“测试框架”,它自动模拟任何未在 spring 上下文中显式声明的 Autowired 依赖项,因此存根/模拟对我们来说是一个轻量级的过程。这是一个提供者测试的摘录,该测试执行 CustomerResource 并启动存根的 CustomerOrchestrator bean:
java - PactDslJsonObject 被解析为 Empty Map {}
下面的对象在调试时显示为{}
而不是{"types" : ["Ice Cream"] }
预期的那样。为什么会这样。
pact - au.com.dius.pact.model 包中缺少“PactFragment”
我是 Pact 的新手。
我从 Github 下载了代码,“pact-jvm”项目。我使用 Gradle 设置从“现有源”在IntelliJ中创建了一个新项目。
它很好地导入了所有包。
但是,当我尝试在其中运行一些测试时,我得到了一个
找不到标志
错误如下,
错误:(5、30)java:找不到符号
符号:类 PactFragment
位置:包 au.com.dius.pact.model
我查看了我的包“package au.com.dius.pact.model”,发现这个包中缺少“PactFragment”。
除此之外,此包中还缺少以下类。
但是,我对来自 Github 的“pact-jvm”项目的所有源代码进行了“git pull”。当我执行“git pull”时,它表明一切都是“已经是最新的”。
有什么我可能缺少的指针吗?
为什么我在这个包'package au.com.dius.pact.model'中缺少这么多类?
谢谢,埃里克
pact - pact-jvm 消费者契约测试
我是新来的契约。我的项目是Java项目。我通读了 pact 文档并找到了 github 项目https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-consumer-junit 我将它导入到我的 eclipse IDE 中。我从这里被困住了。1.首先运行哪个测试。ExampleJavaConsumerPactRuleTest 还是 ExampleJavaConsumerPactTest?2.我看到它是一个gradle build。如何配置运行配置。要提供哪些参数和命令?
pact - 为什么这个 pact-jvm 提供者测试失败了?
我们有一个仅在 Jenkins 上失败的提供程序测试,这使我无法进行调试。
以下是 Jenkins 的一些相关日志:
(有些遗漏……)
交互在协议文件中如下所示:
我的印象是名称应该匹配类型而不是确切值,并且似乎在差异中有一个“名称”字段。
为什么这个测试失败了?
编辑:
这是生成协议片段的代码:
pact - 如何在提供者端为同一消费者跨类分发测试
我有一个场景,我的提供者服务提供 3 个功能。在消费者端,我有 3 个不同的类来为这 3 个功能编写测试。生成 pact 文件时,它包含具有相同消费者-提供者组合的所有测试。到目前为止,一切都很好。
当涉及到提供者测试时,我希望为 3 个功能提供 3 个类的相同结构。但是,如果我这样做了,并且当我从 1st class 运行测试时,PACT 还会尝试根据 pact 文件搜索其他方法,并且找不到其他方法的 cos 失败。我该如何处理这种情况。
示例:
ConsumerTestClass1
ConsumerTestClass2
ConsumerTestClass3
都定义以下协议
@Pact(provider = PROVIDER, consumer = CONSUMER)
public MessagePact createPactForCareerLevelClassifier(MessagePactBuilder builder) {}
现在假设每个类都有 3 个测试方法,所以 pact 文件总共有 9 个
在提供者方面,我有 3 个测试类
ProvdiderTestClass1
ProvdiderTestClass2
ProvdiderTestClass3
ProviderTestClass1 有实际测试用@PactVerifyProvider
注释
现在当我为 ProviderTestClass1 运行测试时,PACT 抱怨它无法找到与其他 6 个实际在 ProvdiderTestClass2 和 ProvdiderTestClass3 类中的合同匹配的方法
http - 协议 HTTP 消息消费者
我在两个组件/微服务之间有关系,其中组件 A 通过 HTTP 向组件 B 发送事件。在传统的协议 HTTP 消费者/提供者模式中,A 是 B 的消费者,因为 A 正在发送请求,B 正在响应。但是,在这种情况下,B 是 A 提供的事件的真正消费者。
有没有办法实现消费者/提供者测试,以便消费者测试可以写在接收端(B)而不是发送端?
我已经看到已经引入了消息协定,听起来它可以在这种情况下使用,但我还没有看到任何易于理解的例子来说明它是如何实现的,以及它是否可以像在我的场景中一样与 HTTP 结合使用。
我正在使用 pact-jvm-junit。
pact - 使用 Pact Broker
有人可以详细指出如何将 JSON 协议逐步发布到 Pact Broker 吗?
已经安装了 docker、dius/pack_broker 和 Postgres(brew 安装)。
缺少以适当方式修复上述所有内容的要点以及将 JSON 协议发布到协议代理的适当脚本。
补充一点,我在消费者端使用 JVM 实现。并在提供者端进行简单的 gradle 验证。