在数据库而不是假存储库上运行测试是不好的做法吗?

Sru*_*uly 13 tdd domain-driven-design data-access

我知道有哪些优点,当我使用更复杂的系统时,我会使用虚假数据.

如果我正在开发一些简单的东西,我可以轻松地在真实数据库中设置我的环境,并且访问的数据非常小,访问时间不是一个因素,我只运行一些测试.

创建虚假数据是否仍然很重要,或者我是否可以忘记额外的编码并跳过真正的东西?

当我说真正的数据库时,我不是指生产数据库,我的意思是测试数据库,而是使用真实的DBMS和与真实数据库相同的模式.

小智 20

使用虚假数据而不是真实数据库的原因是:

  1. 速度.如果你的测试很慢,你就不会运行它们.模拟数据库可以使测试运行速度比其他情况下快得多.
  2. 控制.您的测试需要是测试数据的唯一来源.当您使用假数据时,您的测试会选择您将使用的假货.因此,您的测试无法被破坏,因为有人将数据库置于不熟悉的状态.
  3. 订单独立.我们希望我们的测试可以按任何顺序运行.一次测试的输入不应该取决于另一次测试的输出.当您的测试控制测试数据时,测试可以彼此独立.
  4. 环境独立.您的测试应该可以在任何环境中运行.您应该能够在火车上,飞机上,家中或工作中运行它们.他们不应该依赖外部服务.使用虚假数据时,您不需要外部数据库.

现在,如果您正在构建一个小型应用程序,并使用真正的数据库(如MySQL),您可以实现上述目标,然后通过各种方式使用数据库.我做.但不要搞错,随着应用程序的增长,您最终将面临模拟数据库的需求.没关系,在你需要的时候去做.YAGNI.只要确保你在需要的时候这样做.如果你放手,你就会付钱.

  • 速度是我认为使用真实数据库存在的唯一问题。控制、顺序独立和环境独立都可以用真实的数据库来解决。例如,确保在运行第一个测试之前删除数据库,在事务下运行所有​​测试,不要提交事务。创建数据库层的假实现(其行为与真实数据库层的行为足以编写有用的测试)比仅将 DAL 指向特定于测试的数据库需要做更多的工作。 (2认同)