如何显示 RSpec 测试生成的 SQL 查询日志?

Posted

技术标签:

【中文标题】如何显示 RSpec 测试生成的 SQL 查询日志?【英文标题】:How to show SQL query log generated by a RSpec test? 【发布时间】:2011-10-16 14:21:29 【问题描述】:

我正在为我的 rails 3 应用程序编写规范。我想测试数据库事务是否真的有效。能够在规范驱动的同时查看正在生成我的应用程序的 sql 查询将非常有帮助。

有没有办法像在 rails 控制台中一样查看查询?

我正在使用 Rails 3.0.9、RSpec 2.6 和 sqlite(稍后将迁移到 mysql

【问题讨论】:

How do I turn on SQL debug logging for ActiveRecord in RSpec tests?的可能重复 【参考方案1】:

把它放在你的规格中:

ActiveRecord::Base.logger = Logger.new(STDOUT) if defined?(ActiveRecord::Base)

您可以tail -f log/test.log 看看发生了什么。一个但不是两个。

为 Rails 5.2 编辑,添加这一行:

ActiveRecord::Base.verbose_query_logs = true

感谢Mike Monteiro 的更新!

【讨论】:

谢谢!我也发现这很有用。 benmabey.com/2008/07/04/… 在你的 test.rb 文件中你可能还需要设置config.log_level = :debug 在 Rails 5.2+ 中,您还可以添加 ActiveRecord::Base.verbose_query_logs = true 以查看触发每个查询的代码行【参考方案2】:

根据 Rails 5 文档 (Active Record Explain)。您现在可以使用说明方法。这只会记录您指定的查询,但如果您在测试前有大量 SQL 代码,您也不会感到不知所措。

ap Model.explain

【讨论】:

Model.explain 不记录查询——它执行数据库的 EXPLAIN 命令,该命令为您提供有关如何查询将运行的信息。诸如:它是否使用索引、查询需要检查多少行数据库等。

以上是关于如何显示 RSpec 测试生成的 SQL 查询日志?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Rspec 输出禁用 http 日志?

如何禁用Rspec输出的http日志?

如何使用 rspec 生成控制器规范?

如何使用rspec编写测试用例来发送通知消息

如何告诉 rspec 在没有挂起测试输出的情况下运行?

清理测试数据库,仅使用RSPEC和Capybara运行测试生成的数据