- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 pact 来验证 spring boot 微服务。我已经从消费者生成了协议(protocol)文件,并使用协议(protocol)代理在提供者端对其进行了验证。
我有另一个用例,在根据实际服务响应验证契约文件之前,我需要执行一些代码。我阅读了有关状态更改 URL 和关闭状态更改以实现它的信息,但无法获得如何实现此目的的示例。有人可以帮忙吗?
我的具体情况是:我创建了一个契约(Contract)来更新 ID 为 1234 的客户(名字:test 姓氏:user)。
如果这个客户不存在,那么我需要通过读取协议(protocol)文件中的更新请求中的名字、姓氏、id 以及通过状态更改的附加信息(城市、州、电话号码)来将此数据插入数据库代码。
所以我的问题是,我可以通过状态更改从 pact 文件中读取请求数据,而不是在验证端配置名字、姓氏和 ID 吗?
最佳答案
状态更改 URL 是您在提供者上创建的一个 Hook ,以允许 Pact 告诉提供者它在测试开始时应该处于什么状态。在每次测试运行之前,模拟消费者点击您提供者上的状态更改 URL,并告诉它测试期望的状态名称。
你需要做两件事:
您可以在提供商验证设置中配置状态更改 URL。例如,使用 the maven plugin :
<serviceProvider>
<name>provider1</name>
<stateChangeUrl>http://localhost:8080/tasks/pactStateChange</stateChangeUrl>
...
或者使用 Gradle provider plugin :
hasPactWith('consumer1') {
stateChangeUrl = url('http://localhost:8080/tasks/pactStateChange')
...
这两者都告诉模拟消费者使用 localhost:8080/tasks/pactStateChange
在每次测试之前更改提供者的状态。
上面链接的文档告诉我们,默认情况下,请求的格式是状态字符串和任何参数的 POST 请求:
{ "state" : "a provider state description", "params": { "a": "1", "b": "2" } }
要使用它,您需要在提供程序上实现类似以下未经测试的代码:
@RequestMapping(value = "tasks/pactStateChange", method = RequestMethod.POST)
ResponseEntity<?> stateChange(@RequestBody ProviderState state) {
if (state.state == "no database") {
// Set up state for the "no database" case here
} else if state.state == "Some other state" {
// Set up state here
} else if ... // Other states go here
...
}
return ResponseEntity.ok().build()
}
请原谅该示例中的任何 spring boot 错误 - 我不是 spring boot 的人,但你可以看到一般原则。
使用状态更改 URL,pact 不会告诉提供者任何设置细节。它只是告诉提供者您在测试中使用的预先商定的状态字符串。这可能类似于 "foo exists"
。然后,在为状态更改 URL 实现处理程序时,您会检测到 “foo exists”
,并在那里进行任何显式设置。
if (state.state == "foo exists") {
// do whatever you need to set up so that foo exists
repository.clear()
repository.insert(new Foo("arguments that foo needs",12))
}
如果您想了解更多关于提供者状态的意图,请阅读 wiki page on provider states .
你问:
Can i read the request data from pact file through state change instead of configuring the first name,last name and id in the verification side?
您可能对契约(Contract)测试的意图感到困惑 - 每个测试都是状态和请求的组合。
因此,与其使用一个测试来说:
你用两个测试来说明:
当我提交对客户记录的更新时(在客户存在的状态下),那么我期望 X 响应。
当我提交对客户记录的更新时(在客户不存在的状态下),那么我期望 Y 响应。
这些测试是您的 Pact 契约(Contract)中的两个独立项目。
目的是不在契约(Contract)中包含设置的细节。在消费者方面,您的状态只是一个字符串,表示“存在 id=1234 的客户”。
在提供者端,您的状态更改端点会检测该 URL 并根据需要创建状态。这通常以硬编码的方式完成:
if (state == "Customer with id=1234 exists") {
Database.Clear()
Database.Insert(new Customer(1234, "John","Smith"))
} else if (state == "No customers exist") {
Database.Clear()
}
您不想通过解析状态字符串以参数化的方式执行此操作,因为那样您将在测试消费者和提供者之间创建一个新的复杂契约(Contract)。
消费者测试不应该知道任何有关如何设置提供者状态的信息,他们应该只知道测试需要什么状态(仅按名称)。同样,提供者不需要知道正在测试什么,它只需要知道如何将状态名称转换为实际状态。
关于PACT - 使用提供者状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46183190/
我看到 Pact 可以使用 Microsoft 的 Z3 定理证明器自动检查智能合约的某些属性。智能合约是否有相关属性无法自动验证?如果有,您是否希望逐案验证它们,或者是否正在开展工作以扩展自动检查器
我们正在尝试为 Scala 的 PACT-provider 实现一种混合方法。 我们正在寻找使用 PACT-JVM(Java 变体)的 Pact-JVM 提供方实现的简单示例 我们在 Scala 中有
我想了解为什么会发生以下情况?问题:如果我使用 Pact Junit 规则,Junit 测试会失败并出现 HttpConnect 异常。但是,如果我直接使用 Pact DSL,则会生成相同的测试通过并
我正在使用 JS pact 库 (github.com/pact-foundation/pact-js) 来测试聚合物应用程序。我需要在应用程序中测试ajax代码,我想在浏览器中测试它。 我现在在我的
我正在尝试使用 pact-JVM 在我们的 2 个服务之间生成协议(protocol)。但是当我尝试运行 Java 类时,出现了这个异常。 1) 我怀疑 Pact 本体有问题,对吗? PactDslW
下面的 Json 包含三个我不知道如何在基于 lambda 的 Pact DSL 中建模的东西(而且我无法通过阅读 https://github.com/DiUS/pact-jvm/tree/mast
下面的 Json 包含三个我不知道如何在基于 lambda 的 Pact DSL 中建模的东西(而且我无法通过阅读 https://github.com/DiUS/pact-jvm/tree/mast
我正在尝试使用 pact 来验证 spring boot 微服务。我已经从消费者生成了协议(protocol)文件,并使用协议(protocol)代理在提供者端对其进行了验证。 我有另一个用例,在根据
我正在尝试编写一个契约消费者测试来匹配以下响应。 [ { "accountId" : 1, "permissions" : [ {
我正在为上传文件的 put 请求设置测试。我的 pact 文件中的请求正文由单个字符串组成,其中包含每次测试运行都会更改的 mime 边界。我试图为请求正文字符串定义正则表达式匹配规则,但它不匹配。
我正在尝试在 Pact 中创建一个基本的 hello world 智能合约。在能够完成契约(Contract)的同时,我收到了警告。它并没有阻止我的契约(Contract)运行,但确实让我担心。 在未
我有一个服务将使用 json blob 响应请求,如下所示: { "field1": 1, "field2": "2", "array": [1,2,3] } 我知道我可以使用 EachL
我有一种情况,我用同一个端点编写了 2 个交互。即使我在 with_request 选项中传递了不同的查询,我也遇到了以下错误 - Error: Multiple interaction found
我正在使用 Pact 并创建消费者测试。我对特定请求的响应正文如下所示: PactDslJsonBody responseBody = new PactDslJsonBody()
我正在查看Python implementation协议(protocol)并试图建立提供国。似乎是说,做到这一点的方法是让提供者在服务中内置一个端点,调用该端点将提供者置于正确的状态。问题是我找不到
大约半年前,我的组织开始使用 Pact 在用 Java 编写的 REST 服务/微服务之间创建/验证契约(Contract)。 我们很难决定提供者测试的适当范围或掌握应该是什么,并且希望从其他契约用户
我对是否应该考虑某种类型的测试功能或契约(Contract)有疑问。 假设我有一个像/getToolType 这样的 API,它接受一个 {object""myObject"} 作为输入,并以 {ty
我不明白 @PactVerification 中 assert 的用法.对我来说,它更像是一种复杂的表达方式 1 == 1 .例如: import static org.assertj.core.ap
我是 PACT 的新手。我的应用程序是一个 Spring 启动应用程序。消费者在 PACT 代理中创建了协议(protocol)。现在我正在尝试从提供者端运行测试,并且我正在使用 gradle 插件来
我使用@pact-foundation/pact@latest (为了快速部署我的案例,有一个简单的 jest 示例) 使用此代码: 我已经生成了这个 PACT 文件: 它是根据规范3生成的(这些是设
我是一名优秀的程序员,十分优秀!