Mysql BDD测试REST/JSON-RPC API

Mysql BDD测试REST/JSON-RPC API,mysql,node.js,rest,testing,bdd,Mysql,Node.js,Rest,Testing,Bdd,我在一个项目中工作,该项目混合使用REST和JSON-RPC后端API用于移动应用程序。应用服务器构建在node.js(express、cluster、pm2)+redis(ioredis)+mysql(node mysql)+rabbitmq(amqp)上。现在我们面临着一个沉重的重构,但没有测试!毫无疑问,这是一个巨大的麻烦:( 一开始,我们计划用BDD测试来覆盖它。这听起来很容易,但有一个障碍,那就是在测试开始之前准备好环境。例如,一些测试更改存储中的数据,我们每次都必须重新加载数据库转储

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

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

因此,我对用于准备数据存储(MySQL和Redis)状态(内容)的方法/工具/范例感兴趣


提前感谢您提供的任何建议。

大多数BDD工具使用的“给定/何时/然后”模板的有趣之处在于,行为是由“何时”而不是“给定”引起的。因此,“给定”的设置方式无关紧要

很多人使用真正的工具来设置给定的,但不一定要这样

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

即使对默认数据进行了更改,也可以在“AfterScenario”钩子中重置这些更改

如果每次都需要设置不同的名称,请尝试在所使用的名称后附加datetimestamp。例如,帐户不是由North先生创建的,而是由North20160202224400先生创建的。这样,您将始终拥有唯一的ID。您可以将此项与“after”组合使用钩子来确保你也在清理正确的东西

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

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


如果没有更多的背景,很难知道这些方法中的哪一种适合你,但是所有这些——对Givens的“我不在乎如何”方法,背景数据,以及“赛后”钩子和PageObject模式是为了解决您所面临的问题而创建的。

我们使用MochaJS进行测试,并使用
beforeach
钩子将SQL文件加载到MySQL中,并填充Redis为每个测试准备存储状态。正如我前面所说的,这很不舒服,例如,当我在实体的模型中只添加一个字段时,我必须更改e:一些SQL文件,一些Redis文件和测试代码。我真的希望世界上至少有一个工具可以自动化这个过程。毫无疑问,我们能够编写自己的自行车,我们知道它如何工作,但我非常不喜欢重新发明自行车。你看过Builder模式吗?这是创建这种自行车的常见方法您正在谈论的实体。它将用代码替换SQL文件,这通常更易于维护。您可以使用默认值设置它,以便在场景不关心字段的情况下,您可以不更改任何内容。您需要详细说明有关您的测试体系结构的这个问题,特别是如何部署每个部分以及访问类型您的测试套件必须连接到后端服务器(如果有)。