【问题标题】:Cleanup database state in a beforeEach?在 beforeEach 中清理数据库状态?
【发布时间】:2019-12-11 11:57:21
【问题描述】:

Using after or afterEach hooks中,建议清理beforeEachbefore中的server/db状态。我理解其中的原理,但我相信文本缺乏一些真实的用例。这是一个我不知道如何按照最佳实践解决的用例。

想象一下,我正在测试我自己的 github 克隆。为了让我的测试有一个干净的环境,我希望赛普拉斯使用一个干净的临时用户和一个干净的临时存储库。为了避免针对同一服务器的多个赛普拉斯实例之间的冲突(例如,多个前端开发人员并行测试他们的更改),应该有一个用户和一个专用于每个赛普拉斯实例的存储库。这可以通过生成具有众所周知的随机 id(例如,temp-user-13432481temp-repo-134234)的用户和存储库来实现。清理数据库中的混乱只是删除temp-* 数据库。

问题是何时清理。如果按照建议在beforeEach() 中完成清理,则在 Cypress 实例中运行测试将删除并行运行的其他 Cypress 实例的数据。

我是否缺少明显的解决方案?人们通常如何清理数据库中的临时测试数据?

【问题讨论】:

  • 我通常不推荐这种类型的数据库测试混乱。但我意识到人们做事的方式不同。我所做的是模拟我所有的 API 调用以返回我想要的,所以我永远不会访问数据库。我认为您应该使用其他类型的测试来测试数据库。我并不是说你的做法是错误的。我只是相信 cypress 是为了测试 UX,而不是搞乱数据库。因此,如果我需要一份客户列表,我会对其进行模拟并带回虚假数据。如果我保存一些东西,我也会嘲笑它。我从不碰数据库。我想重复一遍,我并不是说你所做的事情是错误的或不应该这样做..
  • @Maccurt 我看不到在复杂项目中模拟整个 API 的机会。您将不得不维护大量的固定装置,并随着 API 的每一次变化而调整它们。此外,在使用真正的 API 时,您可以在许多场景中免费获得 API 测试。
  • 我们分两步清理我们的测试数据。第一步是套件范围的存储,其中存储了一些创建的 testdata-id。在每个it 之后,这些 id 都会被清除,具体取决于 testdata 的类型(某些 testdata 无法完全删除)。然后在第二步中,每次在 jenkins 中运行测试后,都会启动后续的 jenkins 作业以清理那些未清理的数据(例如,如果 cypress chrashes 等)
  • 做对是一件很棘手的事情,每个人都有不同的需求。我确实有一些针对真实 API 和数据库的测试,但它们都在我的测试环境中。我试图模拟任何数据可能发生变化并因此破坏测试结果的东西。我还想要一个将数据库设置回基线的脚本。我有所有的混合物。我个人希望 API 由编写 API 的人测试,在我的环境中,一个 C# 开发人员编写了 REST-API,我们设置了 C# N-“单元测试”(或集成测试)来命中 API。我们正在使用邮递员,但是......祝你好运......愉快的谈话
  • @Maccurt 您如何确保您的客户端能够使用最新的 API 更改?您可以根据需要单独测试每个,但除非您有集成测试 (e2e),否则无法确保正确性。

标签: cypress


【解决方案1】:

显而易见的答案是不对单个远程服务器以分布式方式运行测试(而是在每个客户端上本地运行数据库服务器),但由于这不是您问题的答案,这里有一些想法:

  1. 设置一个 cron 作业,在每天结束时清理旧的测试存储库/用户。

    如果您只清理早于例如几个小时,它将避免清理运行测试仍可能使用的资源。

    您必须确保 id 是随机的并且足够大(即有足够的熵),即使您有一段时间不清理它们也不会遇到冲突。

  2. 让每个客户端(即运行测试的 PC)使用一个指纹,您将使用该指纹来命名数据库中的存储库/用户,并在每次测试运行之前清理它们。

    这样,每个客户端只会清理自己的资源。

我倾向于解决方案 (1)。

【讨论】:

    猜你喜欢
    • 2014-02-14
    • 2021-11-30
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2011-07-04
    相关资源
    最近更新 更多