测试报告的最佳实践

时间:2014-12-11 14:45:46

标签: ruby-on-rails ruby unit-testing rspec

有没有人有关于如何测试大量数据集的最佳实践?

例如,我有一个运行此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

在一个规范中,这成了一大堆工厂,每个对象有一个或几个。

有没有人有关于如何更优雅地做到这一点的想法或最佳实践?

1 个答案:

答案 0 :(得分:1)

您可以采用的几种技术:

  • 为结果集中存在的订单定义高级别工厂,即不会被where子句过滤掉。有些参数可以自定义,比如日期。使用对报告有意义的名称引用工厂
  • 将查询where子句分解为不同的方法,以便您可以单独测试过滤和聚合。这将允许您使用较小的数据集进行测试,因为您不需要聚合大量数据来证明所有过滤器都能正常工作
  • 中断管道中的过滤器,该管道将添加回下一个过滤器。例如:排除欺诈客户端,排除已标记的交易,排除已发货或已取消的货件,以及添加到要排除的ID的方式的每个步骤。这样,您可以使用更简单的工厂独立测试每个部件。这可能会对性能产生正面或负面影响,具体取决于您的数据集
  • 只有基本的测试覆盖率证明了幸福路径和最常见的案例都包含在内