作为开发人员,我经常发现自己从事缺乏专门测试团队或资源的项目。为了最大程度地减少我在部署进行分期之前必须进行的手动回归测试量,我发现为最关键的情况编写端到端(E2E)测试是最有效的解决方案。我首选的E2E测试工具是柏树。
但是,经常出现的问题是:我们如何确保这些测试中的每一个都可以
- 多次运行;
- 独立运行。
这就是为什么我们需要一种在每个测试后重置数据库的方法。
我的方法基于Gleb Bahmutov's post。不同之处在于,这篇文章适用于Mongo 5.0.11,他的帖子适用于较旧的Mongo版本。
与格莱布(Gleb)帖子的另一个区别是,我要谈论的所有测试都将与应用程序流量有关:注册,登录 和登录测试。
让我们考虑以下示例(存储库为here)
btw cypress recommends要在每个测试之前清理数据库。我仅出于SEO的目的,在邮政标题中写了“之后”。
注册测试
您已经为注册方案写了测试。首次测试通过了。您尝试再次运行测试并获得“电子邮件地址已经存在”错误:
您可能想跳过我在下面写的内容,然后看看存储库中的分支 。在那里,您会看到一个可以不定次运行的注册测试。
文件柏树/support/db.js有助于连接到数据库。
如果您是前端,则不必担心重构此文件。将您的PR转换为工作版本的DevOps将会更改 uri 和 client.db(“ rests”)将其变成适合您公司的东西。他们将建立一个包括测试数据库的单独测试环境。该测试环境将允许进行运行测试,而不必担心生产系统中的重要数据损坏或破坏。
最有趣的文件是 cypress.config.ts 。我花了一些时间试图理解为什么等待 user.remove({})在我意识到它已在更新的Mongo中弃用并由 Deletemany <<< ! /p>
然后,您只需添加一个柏树命令以进行清理:
并在这样的测试中使用它:
登录测试
当我开始为登录用户编写测试时,我发现赛普拉斯不喜欢运行太多时间的测试。如果测试花费太多时间,柏树可能会丢弃以下错误之一(有关此错误的问题 - first,second):
- 流产测试运行,并带有一些有关Web插座的消息;
- 中止打字到形式字段,例如而不是键入“ somebody@gmail.com”键入“某人@gma”。
最好的是,您可以为此测试做捷径。例如。相反,如果通过将值键入表单模仿用户登录,请使用Cypress命令发送发布请求。或使用柏树任务直接更改数据库记录。
另外,此设置可能会有所帮助:
赛普拉斯建议做session switching inside tests,但我们不使用它。可悲的是,我不记得任何有关它为什么对我们当前项目没有用的细节。
假设您要测试登录流程。在测试之前,您需要在数据库中使用用户!
您可能想知道我如何获得我决定使用的密码的加密版本。我暂时将app.js放入以下代码:
登录测试
假设我们要测试登录用户的内容。正如柏树文档中建议的那样,我们将使用快捷方式进行登录:
然后我们会这样使用:
结论
我想告诉更多有关柏树的信息,但是这篇文章已经太长了:(我唯一想提及的是,如果您是开发人员,那就是担心QA但没有太多时间因为它绝对是根据您花费多少时间写/维护测试与测试多少功能的时间的最佳选择。