BDDtestingREST / JSON-RPC API

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

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

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

提前感谢您的任何build议。

对于大多数BDD工具使用的“Given / When / Then”模板,有趣的事情之一是该行为是由“When”引起的,而不是“Given”引起的。 所以,“给定”如何build立并不重要。

很多人使用真实的工具来设置给定的,但它不一定是这样的。

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

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

如果每次都需要设置不同的东西,可以尝试在所使用的名称上添加一个datetimestamp。 例如,这个账户不是由North先生创build的,它是由North20160202224400先生创build的。 这样你总会有唯一的ID。 你可以结合使用这个“之后”的钩子,以确保你正在清理正确的事情。

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

最后,看看页面对象模式 。 它旨在复制网页的行为并将实际的button点击抽象出来,但是您应该能够看到它们之间的相似性,并抽象出创build不同数据片段的行为。 我喜欢用function来思考:“我能用这个服务/网页/ API做什么?” 这有助于我形成PageObject。 这也将帮助您隔离数据创build的行为,以便在发生更改时只会在一个地方更改。

没有更多的上下文,很难知道哪种方法适合您,但所有这些 – Givens的“我不在乎如何”的方法,背景数据,“AfterScenario”钩子和PageObject模式 – 是为了解决你面临的问题而devise的。