【问题标题】:How do you (Unit) Test the database schema?你如何(单元)测试数据库模式?
【发布时间】:2010-10-01 04:34:28
【问题描述】:

当有很多人在处理一个项目时,所有人都可以更改数据库架构,那么对它进行单元测试/测试/验证的最简单方法是什么?到目前为止,我们的主要建议是为每个表编写测试以验证列名、约束等。

有没有其他人做过类似/更简单的事情?我们将 C# 与 SQL Server 一起使用,如果这有什么真正的不同的话。

更新:

  • 我们正在进行的项目部分是使用 SSIS 包来完成大部分工作,因此几乎没有 C# 代码可以再次编写单元测试。
  • 用于创建表/存储过程的代码分布在 SQL 文件中。由于构建系统的原因,我们也可以维护一个单独的 VS DB 项目文件,但我不确定这将如何帮助我们验证架构。

【问题讨论】:

    标签: c# .net sql-server unit-testing testing


    【解决方案1】:

    一个可能的答案是使用 Visual Studio for Database 开发人员并将您的架构与其余代码一起保存在源代码控制中。这使您可以查看差异并了解谁更改了什么的历史记录。

    或者,您可以使用 SQLCompare 之类的工具来查看一个数据库中与另一个数据库相比已修改的内容。

    【讨论】:

      【解决方案2】:

      就我而言,您的(关系)数据库做了两件事:1)保存数据和 2)保存数据之间的关系。

      持有数据不是一种行为,因此您不会对其进行测试

      为了确保关系,只需使用约束。很多约束。到处都是。

      【讨论】:

      • Uhhh,我忍不住评论这个:“持有数据不是一种行为,所以你不会测试它”
      • 10 年后吧?所以我绝对同意,如果测试东西有价值,你应该测试它们。但是“单元测试”中的“单元”是根据行为定义的——即单个业务逻辑,如果要更改,它将自动更改。非行为测试可能很有用,它们只是不是单元测试。事实上,问题似乎根本不是关于单元测试,而是关于对任何模式更改的批准。回想起来,将 DDL 输出为文本并在其上运行 ApprovalTests 可能是一个好主意。
      • 我承认您的评论来自 09。但我一直在研究进化数据库设计,并且测试模式实际上很常见。在我的情况下,更改架构是迁移脚本的一种行为,我希望进行检查以确保迁移完成。使我们能够快速转换架构并同时对其进行测试。
      【解决方案3】:

      这是一个有趣的问题!有很多工具可以用于测试存储过程,但不能用于测试数据库模式。

      您没有发现为代码编写的单元测试通常会发现数据库架构有任何问题吗?

      我使用的一种方法是编写存储过程来将测试数据从开发人员的模式复制到测试模式。这是相当粗略的准备工作,因为存储过程通常会在遇到架构之间的任何差异时崩溃,但它确实会提醒您注意您尚未被告知的任何更改。

      并提名某人成为监控架构更改的 DBA?

      【讨论】:

        【解决方案4】:

        我以前不得不做这种类型的事情,虽然不是在 C# 中。首先,我根据Ode to Code (page 1 of 5) 的讨论构建了一个模式迁移工具(也有现有的工具可以做类似的事情)。重要的是,我构建的迁移工具允许您指定要应用更改的数据库以及要应用的版本。然后,遵循测试优先的方法,每当我需要进行架构更改时,我都会编写一个测试脚本,该脚本将创建一个测试数据库,将版本更改应用于我的目标更改脚本之前的版本,添加一些数据,在下应用更改脚本测试,并确认数据处于预期状态。

        我的主要目标是确认在架构迁移期间没有数据丢失或损坏,而不是专门检查架构是否处于特定状态。需要对您的生产数据集有很好的了解,因此您可以为测试编写具有代表性的样本数据。

        这是否应该被视为单元测试或集成测试是值得商榷的。我倾向于考虑集成测试,因为我不想每次迭代代码时都运行旧测试。不管你想怎么称呼它,我发现它在这种情况下是一个有用的工具。

        【讨论】:

          【解决方案5】:

          这是一个老问题,但似乎人们仍然在这里登陆。所以到目前为止我发现的最好的工具是 Red Gate 的“SQL Test”。它允许您创建作为事务运行的脚本。允许您运行“沙盒”查询来检查数据库的状态。

          【讨论】:

            【解决方案6】:

            这并不真正适合单元测试范式。我建议对模式进行版本控制,并将写入访问权限限制为单个合格的团队成员,例如 DBA 或团队负责人,他们可以针对整个应用程序验证任何请求的更改。架构更改不应随意进行。

            【讨论】:

              【解决方案7】:

              你没有发现为代码编写的单元测试通常会发现数据库架构有任何问题吗?

              当然,这假设您的测试测试了所有内容。

              【讨论】:

                猜你喜欢
                • 2011-09-30
                • 2010-11-23
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-10-08
                • 2010-09-13
                相关资源
                最近更新 更多