【问题标题】:Tests relying on tables being present依赖于存在表的测试
【发布时间】:2025-12-29 03:25:06
【问题描述】:

单元测试是否可以假设存在数据库表?

例如,如果有一个 UserStore 类和关联的 UserStoreTest 测试类。假设这个类是一个系统的一部分,当安装它时,这个类需要一个名为 foo_users 的表的“实例”。那么 UserStoreTest 是否可以假设该表存在并使用它?要求 UserStoreTest 类来设置表本身而不依赖于系统的状态似乎更好,这是相当全局的。前一种方法可以接受吗?

【问题讨论】:

    标签: database unit-testing testing tdd


    【解决方案1】:

    最好的方法可能是找出一种模拟数据库的方法,而不是实际连接到真实数据库。维护数据库的模拟会产生一些开销,但有很多优点。

    • 与真实数据库对话可能会使您的单元测试变得不必要地变慢,尤其是当您走“设置与数据库的连接,然后为每个测试设置表”路线时。
    • 我认为您已经意识到,您的单元测试可能最终取决于易失性数据,这可能会对测试过程产生不利影响,因为它不受测试套件的控制。
    • 单元测试可以在不访问数据库的机器上运行。这意味着您的单元测试不会意外破坏数据库或类似情况。
    • 可能还有其他原因

    如果模拟您的数据库连接是不可行的,一个很好的中间立场可能是拥有一个独立于您的真实/生产数据库的测试数据库。这样,您就可以避免将测试套件连接到真实数据库的担忧,同时保留对数据库的完全控制以进行测试。

    【讨论】: