【发布时间】:2023-03-09 18:02:02
【问题描述】:
在生产服务器上出现此错误
ActiveRecord::StatementInvalid: PG::QueryCanceled: ERROR: canceling statement due to statement timeout <SQL query here>
在这一行:
Contact.where(id: contact_ids_to_delete).delete_all
SQL 查询是带有大量 id 的 DELETE 命令。它超时了。 我想出了一个解决方案,就是批量删除联系人:
Contact.where(id: contact_ids_to_delete).in_batches.delete_all
问题是,如何测试我的解决方案?或者测试它的常用方法是什么?或者是否有任何可以方便测试的宝石?
我看到了两种可能的测试方法:
1.(动态)将测试数据库中的超时设置为少量秒并创建一个测试,在该测试中我生成大量联系人,然后尝试运行我的代码以删除它们。
这似乎是正确的方法,但它可能会减慢测试的执行速度,并且动态设置超时(这将是理想的方法)可能会很棘手。
2. 测试是否批量删除。
这可能很棘手,因为这样我就必须监控查询。
【问题讨论】:
-
我认为你只是在使用 Rails 的方法,因此不应该测试它们。特别是因为没有一个方法真正修复或避免异常。
in_batches只会降低异常发生的可能性。 -
很公平。然而,不通过测试覆盖生产错误是一种不好的做法。现在我认为测试它是做一个胖测试(它只在所有其他测试成功后运行),它在数据大小的意义上模仿生产错误(在 CI 期间,理想情况下应该在与 prod 机器具有相似特征的机器上运行),如果可能的话。
标签: ruby-on-rails ruby postgresql testing rails-activerecord