我正在rails中创建一个REST API。我正在使用RSpec。我想尽量减少数据库调用的次数,所以我想添加一个自动测试来验证作为特定操作的一部分而正在执行的数据库调用的数量。 是否有一种简单的方法将其添加到我的测试中? 我正在寻找的是一种方法来监视/记录由于单个API调用而对数据库进行的调用。 如果这不能用RSpec完成,但可以用其他测试工具完成,那也很棒。如何测试Rails中的数据库调用次数
3
A
回答
2
最容易的事情中的Rails 3可能是钩到通知API。
该用户
class SqlCounter< ActiveSupport::LogSubscriber
def self.count= value
Thread.current['query_count'] = value
end
def self.count
Thread.current['query_count'] || 0
end
def self.reset_count
result, self.count = self.count, 0
result
end
def sql(event)
self.class.count += 1
puts "logged #{event.payload[:sql]}"
end
end
SqlCounter.attach_to :active_record
将打印每一个执行的SQL语句到控制台和计数。然后,您可以编写规范,如
expect do
# do stuff
end.to change(SqlCounter, :count).by(2)
您可能需要过滤掉一些语句,比如那些开始/提交事务或那些活动记录发出来确定表的结构。
1
您可能会对使用解释感兴趣。但那不会是自动的。您需要手动分析每个操作。但也许这是一件好事,因为重要的不是数据库调用的数量,而是它们的性质。例如:他们是否使用索引?
检查:
http://weblog.rubyonrails.org/2011/12/6/what-s-new-in-edge-rails-explain/
0
Fredrick的回答对我很好,但在我的情况下,我也想知道每个ActiveRecord类的调用个数。我做了一些修改,并以此为结束,以防其他人使用。
class SqlCounter< ActiveSupport::LogSubscriber
# Returns the number of database "Loads" for a given ActiveRecord class.
def self.count(clazz)
name = clazz.name + ' Load'
Thread.current['log'] ||= {}
Thread.current['log'][name] || 0
end
# Returns a list of ActiveRecord classes that were counted.
def self.counted_classes
log = Thread.current['log']
loads = log.keys.select {|key| key =~ /Load$/ }
loads.map { |key| Object.const_get(key.split.first) }
end
def self.reset_count
Thread.current['log'] = {}
end
def sql(event)
name = event.payload[:name]
Thread.current['log'] ||= {}
Thread.current['log'][name] ||= 0
Thread.current['log'][name] += 1
end
end
SqlCounter.attach_to :active_record
expect do
# do stuff
end.to change(SqlCounter, :count).by(2)
相关问题
- 1. Rails测试数据,在数据库中
- 2. 在rails中使用测试数据库
- 3. Rails中的数据库测试
- 4. 在rails测试套件中显示的数据库调用
- 5. 如何在每次测试之前让Rails测试数据库重建?
- 6. 如何在rails测试数据库中创建mysql函数?
- 7. 如何测试数据库
- 8. Rails的数据库测试和清除
- 9. 如何使用GIS数据库测试Rails应用程序
- 10. Rails cancan(can)无法识别测试数据库中的数据
- 11. 测试数据库调用C#
- 12. 测试数据库中的行测试
- 13. Rails - 使用测试数据库与pow测试域
- 14. 如何为测试数据库指定用户(Rails 4)
- 15. 如何在rails测试中阻止数据库
- 16. 如何在Rails中设置测试数据库配置
- 17. 如何在Rails 3中更新测试数据库?
- 18. Ruby on Rails - 测试数据库
- 19. Rails Rspec测试重置数据库
- 20. Rails 4生成测试数据库
- 21. rails测试数据库不会擦除
- 22. 数据库错误与Rails测试
- 23. 如何测试调用Java中的静态方法的次数?
- 24. 如何使用测试数据库代理生产数据库?
- 25. Python嘲笑:如何测试递归函数的调用次数?
- 26. Rails - 使用开发数据填充测试数据库
- 27. 在Rails中使用Sqlite3测试数据库和Postgres开发/生产数据库
- 28. 对MongoDB数据库中的测试数据运行node.js测试
- 29. 如何为不在数据库中的测试夹具数据
- 30. 编写集成测试,测试数据库,Web服务调用