如何测试数据库迁移?

时间:2010-02-25 07:39:30

标签: sql-server unit-testing migration migratordotnet

我正在使用Migrator.NET为应用程序编写数据库迁移。 Marc-AndréCournoyer写道:

  

就像你的应用程序中的任何代码一样   必须测试您的迁移。起起伏伏的代码。做它的一部分   持续构建过程并测试它   在尽可能多的不同数据库和   环境,你可以。

我该怎么做?假设我有创建表的Up()方法和丢弃同一个表的Down()方法,我正在使用SQL Server。测试怎么样?我是否应该对系统表(如select * from sys.columns)运行SQL查询,以检查表是否已创建并且具有正确的结构?如果我们使用NHibernate会怎么样?

修改 我的意思是Rails ActiveRecord Migrations意义上的迁移(基于C#代码以小步骤创建,修改和拆除数据库)。

编辑2 here我在那里读到了我们应该测试迁移的地方。这篇博文实际上是从Migrator的wiki链接的。

6 个答案:

答案 0 :(得分:6)

您是否测试了DAL - 某种集成测试?

您需要的不仅仅是迁移脚本,还需要基线脚本。如果要测试数据库升级,则应在测试/临时服务器上运行基线中的所有脚本以创建最新版本的数据库。然后针对最新的测试数据库测试您的DAL。如果所有DAL测试都成功,那么您的迁移应该是成功的(否则您的DAL测试不够完整)。

这是一个昂贵的测试,但它几乎坚如磐石。我个人承认此刻手动完成了很多工作;我们有一个内部迁移工具,它将应用所有脚本(包括基线),因此测试数据库设置和DAL测试是单独的步骤。虽然它有效。如果你想确保创建一个表,那么没有比实际尝试向其中插入数据更好的方法了!

您可以尝试通过查看系统目录和INFORMATION_SCHEMA视图等来验证结果,但最终确定实际正常工作的唯一方法是尝试使用新对象。仅仅因为这些物体并不意味着它们具有功能性。

答案 1 :(得分:1)

也许这个脚本可以帮助你:

http://www.benzzon.se/forum/uploads/benzzon/2006-03-27_134824_sp_CompareDB.txt

这个脚本比较两个db。(结构和数据)

答案 2 :(得分:1)

源代码控制用于拍摄当前代码库的快照。迁移用于将数据库从一个版本更改为下一个版本。因此,在未来的某个时间点,您可以使用旧数据库,应用迁移并使用最新的代码库。

我从未见过实际的迁移测试。我已经看到测试结果,他们已经抓住/提醒我运行最新的迁移。

describe User do
  it { should have_column :name, :type => :string }
  it { should validate_presence_of :name}       
end

所以有人改变了模型。添加测试以反映模型。添加迁移。然后提交来源。
你抓住了最新的运行测试。测试失败,因为数据库不对应。您记得运行迁移,然后重新运行测试。成功。

答案 3 :(得分:1)

如果使用NHibernate,将迁移测试视为整体持久性测试策略的一部分,即如果您可以创建并保存所有实体而没有任何错误,那么您的数据库应该是正确的。< / p>

答案 4 :(得分:0)

您可以对数据库系统对象进行比较,但是您需要有一个可以比较的目标 - 否则您将知道如何通过或失败?

我认为您最好创建一组边缘案例CRUD操作测试用例,以便在数据层中执行实体或操作。如果其中任何一个失败,则数据库与所需内容不同步。即,如果字段char(20)的插入失败,因为它只是数据库中的char(15)。然后可以进行db结构比较,看看是否关闭。

您可以通过仅关注最近更改的项目并假设已应用先前的更改来使此短路。

答案 5 :(得分:0)

我也正在寻找答案。我认为这应该在集成环境而不是单元测试环境中进行测试:对于单元测试(DAL),我删除数据库并重新创建它。

但是,理想情况下,我希望有一个集成环境,我的数据库是从生产中复制的,数据库迁移脚本是双向运行的: 向上以确保平稳升级生产和向下以确保可以回滚。

相关问题