我正在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服務調用