预提交测试是否应使用大数据集,如果查询耗时太长,或使用小型测试数据库会失败?

时间:2010-02-16 14:06:21

标签: python sql mysql tdd automated-tests

我正在开发一些Python模块,它们使用mysql数据库插入一些数据并生成各种类型的报告。我正在进行测试驱动开发,到目前为止我一直在运行:

  • 针对在每个测试用例结束时丢弃的临时数据库的一些CREATE / UPDATE / DELETE测试,
  • 一些报告生成测试专门针对生产数据库的副本执行只读操作,主要是SELECT,写在(在这种情况下有效)假设我的数据库中的某些内容不会改变。

某些SELECT操作运行缓慢,因此我的测试耗时超过30秒,这破坏了测试驱动开发的流程。我可以看到两个选择:

  1. 只将我的一小部分数据放入我用于测试报告生成的生产数据库的副本中,以便测试足够快以进行测试驱动开发(不到3秒钟最适合我),或者我可以将测试视为失败。然后,我需要进行单独的性能测试。
  2. 使用与主测试数据库一样多的数据填充生产数据库副本,并添加在测试时间过长的情况下未通过测试的计时代码。
  3. 我不确定采取哪种方法。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我会两个都做。首先针对小集运行以确保所有代码都正常工作,然后针对需要进行时间测试的大型数据集运行,特别是选择,搜索和报告。如果您在多个行集上进行插入或删除或更新,我会针对大集测试它们。简单的单行动作查询不太可能花费太长时间,但如果它们涉及很多连接,我也会对它们进行测试。如果查询不会在超时限制内的prod上运行,那么这是一个失败而且远远更好,要尽快知道,这样你就可以在你带来刺激之前解决问题。

答案 1 :(得分:1)

对真实数据进行测试的问题在于它包含大量重复值,而且边缘情况不够。也很难知道预期值应该是多少(特别是如果你的实时数据库非常大)。哦,根据实际应用程序的作用,将数据用于测试或开发是非法的。

通常最好的事情是编写测试数据以配合测试。这是非常乏味和无聊的,这就是为什么这么多TDD从业者厌恶数据库的原因。但是,如果您有一个实时数据集(可以用于测试),那么请为测试采用非常简化的数据子集。如果你可以针对30个记录的数据集编写有效的断言,那么对三万个数据集运行测试只是浪费时间。

但是肯定的是,一旦你得到了返回正确结果的查询,就可以通过一些性能测试来查询。