【问题标题】:Tests relying on tables being present依赖于存在表的测试
【发布时间】:2025-12-29 03:25:06
【问题描述】:
单元测试是否可以假设存在数据库表?
例如,如果有一个 UserStore 类和关联的 UserStoreTest 测试类。假设这个类是一个系统的一部分,当安装它时,这个类需要一个名为 foo_users 的表的“实例”。那么 UserStoreTest 是否可以假设该表存在并使用它?要求 UserStoreTest 类来设置表本身而不依赖于系统的状态似乎更好,这是相当全局的。前一种方法可以接受吗?
【问题讨论】:
标签:
database
unit-testing
testing
tdd
【解决方案1】:
最好的方法可能是找出一种模拟数据库的方法,而不是实际连接到真实数据库。维护数据库的模拟会产生一些开销,但有很多优点。
- 与真实数据库对话可能会使您的单元测试变得不必要地变慢,尤其是当您走“设置与数据库的连接,然后为每个测试设置表”路线时。
- 我认为您已经意识到,您的单元测试可能最终取决于易失性数据,这可能会对测试过程产生不利影响,因为它不受测试套件的控制。
- 单元测试可以在不访问数据库的机器上运行。这意味着您的单元测试不会意外破坏数据库或类似情况。
- 可能还有其他原因
如果模拟您的数据库连接是不可行的,一个很好的中间立场可能是拥有一个独立于您的真实/生产数据库的测试数据库。这样,您就可以避免将测试套件连接到真实数据库的担忧,同时保留对数据库的完全控制以进行测试。