【问题标题】:RSpec: Request specs execution time substantially slower due to lots of data being involvedRSpec:由于涉及大量数据,请求规范的执行时间大大减慢
【发布时间】:2021-08-28 17:27:16
【问题描述】:

我正在构建一系列对大量数据进行操作的 API。我一直在使用请求规范来测试它们。对于平均规格,我需要在数据库中拥有大约 20 到 30 条记录,这些记录从数据库关系的角度来看是相互连接的。大多数请求规范都需要更改这些记录的一小部分,因为我需要针对许多不同的可能场景测试 API。

由于我在大多数测试中都对数据进行了变异,因此我应该为每个规范单独重新创建所有这 20-30 条记录。就我而言,最好的做法是从每个测试的干净数据开始,不受以前规范的影响,这样每个测试都与其他测试完全隔离执行,并防止不需要的先前突变。

我的问题是执行时间受到很大影响(几秒钟),因为我总是为每个规范重新创建测试数据。我尝试了两种方法:

  • 使用让!语句(不能简单地使用 let 语句,因为我总是需要在每次测试之前将数据存储在数据库中)
  • 使用 before(:all),我将在其中定义所有测试的数据后,在每个测试完成后,仅重新创建在该规范中修改的实例变量。尽管这大大加快了时间,但我担心测试的正确性可能会受到影响,共享相同的状态而不是相互隔离。

在我的情况下,您认为最好的做法是什么?有没有办法同时获得测试的快速执行时间和状态完整性?还是我应该选择上面提出的一种方法?

【问题讨论】:

  • before_all 通常最好避免使用,并且设置所有依赖项有一个解决测试排序问题和抖动测试的秘诀。

标签: ruby-on-rails rspec


【解决方案1】:

与模型测试相比,系统级测试的性能通常较差。没有简单的答案,但您可以通过一些技巧进行渐进式改进。

尽可能在模型测试中进行测试,并减少在请求测试中测试的变体数量。

将模型测试分解为更小部分的测试。每个模型测试不需要 20-30 条记录。少量就足够了。

如果直接使用 sql 与 Ruby 和 ActiveRecord 相比,可以更快地加载数据库。

【讨论】:

    猜你喜欢
    • 2018-11-02
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多