【问题标题】:BDD testing REST/JSON-RPC APIBDD 测试 REST/JSON-RPC API
【发布时间】:2016-02-02 14:47:06
【问题描述】:

我在一个项目中工作,该项目将 REST 和 JSON-RPC 后端 API 混合用于移动应用程序。应用服务器构建在 node.js (express, cluster, pm2) + redis (ioredis) + mysql (node-mysql) + rabbitmq (amqp) 之上。现在我们面临着大量的重构,但没有测试!毫无疑问,这是一个巨大的麻烦:(

一开始,我们计划用 BDD 测试来覆盖它。这听起来很容易,但有一个障碍,那就是在测试开始之前准备好环境。例如,一些测试更改了存储中的数据,我们每次都必须重新加载数据库转储。坦率地说,这非常不方便。此外,将其保持在实际(最新)状态并不容易,例如当我更改代码时,我也必须更改转储。

所以,我对可用于准备数据存储(MySQL 和 Redis)的状态(内容)的方式/工具/范式感兴趣。

提前感谢您的任何建议。

【问题讨论】:

  • 您需要针对您的测试架构详细说明这个问题,特别是每个部分的部署方式以及您的测试套件对后端服务器的访问权限(如果有)。

标签: mysql node.js rest testing bdd


【解决方案1】:

大多数 BDD 工具使用的“Given / When / Then”模板的一个有趣之处在于,该行为是由“When”而不是“Given”引起的。所以,如何设置“Given”并不重要。

很多人使用真实的工具来设置 Given,但不一定非得如此。

您可以使用现有的标准数据设置“给定”。例如,我可能会说,“鉴于一篇关于寨卡病毒危机的文章......”如果你现在在一家报纸网站上工作,你会有很多文章。您可以检查以确保有一个,甚至可以使用此步骤来存储您希望在接下来的步骤中看到的文章 ID。您可以设置一些“默认数据”来为您提供这篇文章。检查是否有一个是可以的,如果没有,就做一个(只要它总是让数据库在下一个场景中保持一致的状态——不要依赖一个场景一个接一个地运行!)

即使您对默认数据进行了更改,您也可以随时在“AfterScenario”挂钩中重置这些更改。 JBehave、Cucumber 和 SpecFlow 都有这些,as does Cucumber.js。

如果您每次都需要设置不同的内容,请尝试将日期时间戳附加到所使用的名称。例如,该帐户不是由 Mr North 创建的,而是由 Mr North20160202224400 创建的。这样,您将始终拥有唯一的 ID。您可以将它与“after”钩子结合使用,以确保您也清理了正确的东西。

不要害怕使用“背景”数据,可以为每个场景设置它来代替“默认”数据。请记住,您可以对这些进行简单的 SQL 调用;您不必通过任何 UI。

最后,看看page object pattern。它旨在复制网页的行为并抽象出实际的按钮点击,但您应该能够看到这与抽象出创建不同数据片段的行为之间的相似之处。我喜欢从功能的角度来思考:“我可以用这个服务/网页/API 做什么?”这有助于我形成 PageObject。这也将帮助您隔离数据创建的行为,这样当它发生变化时,它只会在一个地方发生变化。

如果没有更多上下文,很难知道哪种方法适合您,但所有这些方法 - 对 Givens 的“我不在乎如何”方法、背景数据、“AfterScenario”钩子以及PageObject 模式 - 旨在解决您面临的这类问题。

【讨论】:

  • 我们使用 MochaJS 进行测试,使用 beforeEach 钩子将 SQL 文件加载到 MySQL 并填充 Redis 为每个测试准备存储状态。正如我上面所说,它很不舒服,例如当我只向实体模型添加一个字段时,我必须更改:一些 SQL 文件、一些 Redis 文件和测试代码。我确实希望世界上至少存在一种工具可以使该过程自动化。毫无疑问,我们能够编写自己的自行车,并且我们知道它如何工作,但我非常不喜欢重新发明自行车。
  • 你看过建造者模式吗?这是创建您正在谈论的实体类型的常用方法。它将用代码替换 SQL 文件,这通常更容易维护。您可以将其设置为默认值,这样如果场景不关心该字段,您无需更改任何内容。
猜你喜欢
  • 1970-01-01
  • 2018-10-02
  • 2012-12-06
  • 2021-05-14
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多