将pact用于具有一系列请求和响应的服务

哈里先生

这是我的用例:

我的服务是:ServiceA。
它取决于以下服务:ServicesB和ServiceC。

ServiceA使用一些身份验证详细信息(用户名和密码)向ServiceB发送POST请求,然后ServiceB回复带有sessionId的json文档。

请求:

POST /authenticate
{
    "username": "_at_api",
    "password": "xxx"
}

响应:

{
    "sessionId": "axy235da7ad5a24abeb3e7fbb85d0ef45f"
}

上面的sessionId用于从ServiceA到ServiceC的所有api调用。

ServiceA使用POST请求向serviceC请求启动作业,而serviceC返回带有作业ID(字母数字)的内容。

请求:

POST /jobs/local/start
Header: Authentication: axy235da7ad5a24abeb3e7fbb85d0ef45f
{
    ...
}

响应:

{
    "status": "RUNNING",
    "jobId": "a209016e3fdf4425ea6e5846b8a46564abzt"
}

ServiceA使用上面返回的jobId继续轮询serviceC以完成作业:

请求:

GET /jobs/status/a209016e3fdf4425ea6e5846b8a46564abzt
Header: Authentication: axy235da7ad5a24abeb3e7fbb85d0ef45f

响应:

{
    "status": "RUNNING"
}

轮询将继续进行,直到状态返回为COMPLETED或FAILED。

响应:

{
    "status": "COMPLETED"
}

如何使用Pact测试serviceA?

我的计划是仅使用单元测试和合同测试来实现90%以上的代码覆盖率。这是一个好主意,还是需要使用虚拟服务器进行单独的测试?我的理解是Pact是虚拟服务器的超集(例如:mountebank),并且虚拟服务器可以做的一切,Pact都可以做。因此,我不需要单独的组件测试。另外,看起来合同测试完全取代了端到端测试,因此我也不需要端到端测试。这是正确的吗?

蒂莫西·琼斯(Timothy Jones)

另外,看起来合同测试完全取代了端到端测试,因此我也不需要端到端测试。这是正确的吗?

不会。合同测试不是功能测试(请参阅具有相同标题的出色文章

什么是合同测试?

合同测试是关于测试两个组件是否能够通信。

考虑房屋与邮递员之间的合同:邮递员需要知道他们可以接近房屋并发送邮件(而且有时他们可能无法做到这一点-邮箱已满)。

从邮政工作人员的角度来看,合同看起来像这样:

  • 查找邮箱(成功和失败案例)
  • 将帖子传递到邮箱(有成功和失败案例)

请注意,邮政工作人员对邮箱的实现一无所知。传递到邮箱的失败可能有多种原因-可能是门被卡住了,也许盒子已经满了,或者帖子太大而无法放入其中。

在这种假设的情况下,我们的邮政工作人员在这些情况下没有做任何不同的事情-他们只是无法送货。因此,从合同的角度来看,失败的原因是无关紧要的。可以测试合同-工人可以尝试交付职位,并且合同可以成功或不成功-可以在不列举所有可能的失败原因的情况下对其进行测试。

请参阅上面链接的文章以获取更详细的示例,但引用结尾:

合同应涉及以下方面:

  • 消费者中的错误
  • 消费者对端点或有效载荷的误解
  • 提供者在端点或有效负载上打破更改

Pact的一个非常不错的功能是,您可以仅根据合同所依赖的通信内容来测试多个合同。

请注意,消费者合同测试仅描述消费者需要进行或理解的沟通。合同不是(不一定)完整的API描述。

好的,但是为什么不能将合同测试用于端到端测试?

可以使用一个工具,如条约,以取代你的终端到终端的测试。但是,尽管合同测试与端到端测试所需的功能有很多相似之处,但是合同测试(尤其是Pact)并不是为端到端测试而设计的。

如果您通过扩展现有用户的测试来进行端到端测试(例如,将所有可能的失败原因添加到后工作人员的测试中),那么合同的含义就不再明确了。现在,合同描述了通信和行为的工作方式。

当您开始添加更多的使用者(例如包裹快递)时,这将导致问题-您是否在所有使用者中重复所有失败案例,还是只是将其保留在原始使用者测试中?如果您重复测试,那么如果更改提供程序的行为,那么您将有很多事情需要更改-并且测试将很脆弱。如果您不重复测试,则端到端测试将卡在一个使用者中-如果您停用该使用者,则会丢失所有这些问题。

使用纯合同测试,如果您要添加消费者可能已经理解的更多失败原因,则(理想情况下)您无需进行任何更改。

尝试此操作还有很多其他原因(您的测试开始严重依赖准确的数据,如果您的测试是端到端测试,则失败的验证和can-i-deploy挂钩的含义会改变。 ),但关键要点是Pact并非旨在替代端到端测试。可以通过这种方式使用它,但是不建议这样做,并且可能导致痛苦的维护。

如何使用Pact测试serviceA?

您可以使用Pact提供程序状态作为每个请求的前提条件来分别描述每个请求。

此外,您可能会发现有关PACT-使用提供者状态的问题很有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

對一系列索引求和

将一系列功能应用于数据

如何将具有递减值的多行添加到一系列中

如何将一系列键转换为具有Pandas索引的位置?

将坐标更改为R中具有多个图层的一系列栅格

如何具有一系列不同的交替颜色

Clojure,具有一系列功能的映射

具有一系列特定值的 Prolog FindAll

如何将一系列参数应用于 MATLAB 中的一系列函数?

用于一系列数字的 Grep

如何将具有重复键的一系列对象合并为一个?

如何将具有重复键的一系列对象合并为一个?

如何将小计和求和与一系列条件组合

将一系列分类数据转换为具有包含类别和新ID的多索引的数据框

如何将一系列属性名称转换为具有相应属性值的标题

如何将具有匹配特征的PHP数组的元素处理为一系列聚合?

响应式编程-响应一系列事件

VBA对一系列单元格求和

如何在Rust中求和一系列数字?

如何对一系列日期时间求和

如何动态求和一系列列

如何对一系列服务器 IP (URL) 执行相同的 curl 请求

查询构建以查找所有一系列记录均具有值的记录

具有一行的DataFrame是否比一系列的要慢得多?

拟合一系列线性模型以将因变量分开以用于不同的分组变量

将EXCEL OFFSET IN R用于一系列值和多次

将累积总和应用于一系列 pandas.df

将一系列函数应用于值并获得最终结果

将公式应用于一系列单元格而无需拖放