Pact测试远程Broker报No Pact files were found to verify异常
Pact契约测试切换远程Broker后报无可用契约文件问题
问题现象
- 相同测试代码连接本地部署的Pact Broker时可正常执行通过,切换为远程环境Pact Broker地址后测试执行失败
- 涉及的测试配置如下:
// 测试执行失败的远程Broker配置 systemProperty 'pactbroker.url', 'https://pact-broker.internal-dev.com/' // 测试执行通过的本地Broker配置:本地部署、已提前完成对应契约发布 systemProperty 'pactbroker.url', 'http://localhost:9292/'
- 测试执行时抛出的核心错误栈:
No Pact files were found to verify Provider: Provider1 Source: Pact Broker https://pact-broker.internal-dev.com/ au.com.dius.pact.provider.junitsupport.loader.NoPactsFoundException: No Pact files were found to verify Provider: Provider1 Source: Pact Broker https://pact-broker.internal-dev.com/ at au.com.dius.pact.provider.junit5.PactVerificationInvocationContextProvider.provideTestTemplateInvocationContexts(PactJUnit5VerificationProvider.kt:49) at au.com.dius.pact.provider.spring.junit5.PactVerificationSpringProvider.provideTestTemplateInvocationContexts(PactVerificationSpringProvider.kt:24) at org.junit.jupiter.engine.descriptor.TestTemplateTestDescriptor.lambda$execute$0(TestTemplateTestDescriptor.java:102) and more
补充背景信息
- 异常影响范围:该问题仅在单个服务上出现,其余所有服务使用完全相同的配置连接远程Pact Broker均可正常运行;出问题的服务连接本地Pact Broker时无任何异常。调试发现
resolvePactSources方法返回的tests集合为空,对应调试断点截图:
- 异常触发逻辑:触发点为
PactVerificationInvocationContextProvider的provideTestTemplateInvocationContexts方法,当方法返回的tests集合为空且测试类未添加IgnoreNoPactsToVerify注解时,就会抛出上述NoPactsFoundException,对应源码逻辑如下:
override fun provideTestTemplateInvocationContexts(context: ExtensionContext): Stream<TestTemplateInvocationContext> { logger.trace { "provideTestTemplateInvocationContexts called" } val tests = resolvePactSources(context) return when { tests.first.isNotEmpty() -> tests.first.stream() as Stream<TestTemplateInvocationContext> AnnotationSupport.isAnnotated(context.requiredTestClass, IgnoreNoPactsToVerify::class.java) -> listOf(DummyTestTemplate).stream() as Stream<TestTemplateInvocationContext> else -> throw NoPactsFoundException("No Pact files were found to verify\n${tests.second}") } }
- 已完成的配置有效性校验:
- 将测试配置中的Provider替换为其他服务对应的
Provider2时,可正常从远程Broker拉取到Pact文件(仅因服务契约不匹配触发测试失败),可排除网络连通性、基础配置格式错误类问题 - 曾尝试在契约发布侧重命名Provider名称后重新发布契约、调整配置验证,问题仍复现
- 远程Broker上确实已存在对应Provider1的已发布Pact契约文件,文件列表截图:

- 将测试配置中的Provider替换为其他服务对应的
待解决疑问
初步怀疑是版本相关问题,但该假设无法解释本地Broker可正常运行的现象,需明确该问题的可能成因,以及对应的排查、解决路径。
内容的提问来源于stack exchange,提问作者Pati Ram Yadav
相关产品推荐
相关产品推荐

