我是PACT的新手。我的应用程序是一个spring boot应用程序。消费者在PACT经纪人中创建了协议。现在我正在尝试从提供者端运行测试,我正在使用gradle插件来运行测试。我有几个问题:
消费者发布的契约没有指定任何状态。那么这意味着我不必在提供商端使用任何stateChangeUrl?
Pact发布了get方法。但是,当我运行pactVerify服务器启动时,我的协议测试失败,因为我没有任何现有数据。我怎样才能在之后注入数据。
我想要实现的是:当我说pactVerify
时以下是我的gradle文件
pact {
serviceProviders {
'user-api' {
protocol = 'http'
host = 'localhost'
port = 8080
startProviderTask = startService
terminateProviderTask = stopService
if ('pactVerify' in gradle.startParameter.taskNames) {
hasPactsFromPactBroker('http://pactbroker.com') {
< How to write some code here to say do POST before running PACT >
}
}
}
}
答案 0 :(得分:0)
消费者代码需要在协议中声明提供者状态,以允许您为交互设置正确的数据。
来自docs.pact.io
协议中的每次互动都应该孤立地进行验证,不会保留先前互动的上下文。依赖于先前测试结果的测试是脆弱的,并让你回到整合测试地狱,这是你试图通过使用契约逃避的令人讨厌的地方。
那么如何测试需要数据已经存在于提供程序中的请求?提供者状态允许您通过在运行交互之前将数据直接注入数据源来设置提供者的数据,以便它可以做出与消费者期望的响应相匹配的响应。提供者状态的名称在使用者中的交互的给定子句中指定,然后用于查找要在提供者中运行的代码块以设置正确的数据。如果您需要存根下游系统,或者返回在正常方案中难以导致的错误响应(例如500),则可以在此处设置存根。
提供者状态还允许消费者使用不同的预期响应(例如,不同的响应代码,或具有不同数据子集的相同资源)发出相同的请求。
请记住,提供者状态是关于提供者的状态(例如,有什么数据,如何处理给定的响应),而不是关于消费者的状态,或关于什么是请求。
请参阅Ruby example以了解它在代码中的表现。
答案 1 :(得分:0)
- 消费者发布的条约没有指定任何状态。那么这意味着我不必在提供商端使用任何stateChangeUrl?
醇>
这意味着您已选择不使用此机制来更改状态,因此,您不需要使用该URL。但是你可能希望改变主意。
- Pact发布了get方法。但是,当我运行pactVerify服务器启动时,我的协议测试失败,因为我没有任何现有数据。我怎样才能在之后注入数据。
醇>
为什么不在开始所有测试之前注入数据?如果您没有担心状态,那么您也可以在数据库中预先加载数据的情况下启动提供程序。
如上所述,所有配置信息均可在https://github.com/DiUS/pact-jvm/tree/master/pact-jvm-provider-gradle找到。