【发布时间】:2014-12-11 14:45:46
【问题描述】:
有没有人有关于如何测试庞大数据集的最佳实践?
例如,我有一个运行此 SQL 的报表页面:
SELECT COUNT(DISTINCT order_items.id) AS order_items,
DATE(order_items.created_on) AS date
FROM orders
JOIN order_items ON order_items.order_id = orders.id
JOIN shipments ON shipments.id = order_items.shipment_id
JOIN transactions ON transactions.order_id = orders.id
JOIN customers ON customers.id = orders.customer_id
LEFT JOIN flagged_transactions ON flagged_transactions.transaction_id = transactions.id
WHERE orders.state NOT IN ('a', 'b', 'c', '')
AND customers.state NOT IN ('fraud', 'maybe_fraud')
AND shipments.state NOT IN ('cancelled', 'shipped')
AND shipments.vendor_id = %{some_vendor}
AND order_items.quantity > 0
AND order_items.state IN ('initial', 'approve')
AND order_items.created_on BETWEEN %{start_date} AND %{end_date}
AND (flagged_transactions.id IS NULL OR flagged_transactions.state NOT IN ('pending'))
GROUP BY date
ORDER BY date
在规范中,这变成了一大堆工厂,每个对象一个或几个。
有没有人有关于如何更优雅地做到这一点的想法或最佳实践?
【问题讨论】:
-
您正在访问一个庞大的生产型数据库吗?相反,请创建一个小型测试数据库,其中只包含一个或几个可能的查询结果。
-
单元测试旨在测试代码,而不是数据。您需要为每个场景模拟数据,并测试您是否获得了预期的结果。模拟数据需要是您要测试的场景的最小示例。
-
谢谢@theTinMan,但我当然只打测试数据库。我的问题是关于如何优雅地播种这个数据库而不是调用大量工厂。
-
@UriAgassi,您建议模拟来自数据库的响应并使用模拟响应。但是,当架构有可能更改并且不能防止错误的 SQL 查询时,这并没有多大帮助。因此,将来重构会很危险。
-
@sharkzp - 测试与模式的兼容性不是单元测试的一部分。它更像是系统测试或集成测试。这个测试应该只是看到查询通过,而不是它工作。
标签: ruby-on-rails ruby unit-testing rspec