查询次数限制
每个控制器或API端点允许执行最多100个SQL查询,在测试环境中,当超过这个阈值时,我们将引发错误。
解决失败测试
当一个测试因为执行了超过100个SQL查询而失败时,这个问题有两种解决方案:
- 减少执行的SQL查询的数量。
- 将控制器或API端点列入白名单。
只有在现有控制器或端点有问题时,才应该使用白名单,因为在这种情况下,减少SQL查询的数量可能会花费很多精力。新添加的控制器和端点不允许执行超过100个SQL查询,并且不会对此规则产生例外。如果如果需要大量的SQL查询来执行某些工作,那么最好让Sidekiq来执行这些工作,而不是直接在web请求中执行这些工作。
白名单
万一你有要将控制器列入白名单,首先需要创建一个问题。这个问题应该(最好在标题中)提到控制器或端点,并包括适当的标签(数据库
,性能
,以及至少一个团队特定的标签,例如讨论
).
一旦问题产生,您就可以将有问题的代码列入白名单。对于Rails控制器,最好创建一个before_action
尽可能早地运行的钩子。被调用的方法应该依次调用Gitlab:: QueryLimiting。白名单('issue URL here')
。例如:
类MyController<程序控制器before_action: whitelist_query_limiting,只有:[:显示]def指数#……结束def显示#……结束defwhitelist_query_limitingGitlab::QueryLimiting。白名单(“https://gitlab.com/gitlab-org/..”。)结束结束
通过使用before_action
您不必修改相关的控制器方法,从而减少合并冲突的可能性。
不幸的是,对于Grape API端点,没有可靠的方法在特定端点之前运行钩子。这意味着你必须像这样直接将白名单调用添加到端点中:
得到“/项目/:id / foo”做Gitlab::QueryLimiting。白名单(“……”)#……结束