2010-02-25 96 views
16

我正在使用Migrator.NET为应用程序编写数据库迁移。马克 - 安德烈·Cournoyer写道:如何测试数据库迁移?

就像在应用程序中的任何代码,你 必须测试你的迁移。起起落落的代码。在尽可能多的不同数据库和环境中进行 连续构建过程并在 环境中测试它。

我该怎么做?假设我有用于创建表的Down()方法和用于删除同一个表并使用SQL Server的Down()方法。测试将如何进行?我是否应该对系统表运行SQL查询,如select * from sys.columns,以检查表是否已创建并且它具有适当的结构?如果我们使用NHibernate呢?

EDIT 我的意思是在导轨的ActiveRecord迁移感(创建,修改和在基于C#代码小步骤拆除数据库)迁移。

EDIT 2here的,我了解,我们应该测试迁移。博客帖子实际上是从Migrator的wiki链接的。

+0

我有同样的问题,还没有找到答案。 +1 – Paul 2010-03-02 03:39:41

回答

5

你测试你的DAL--某种集成测试吗?

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

这是一个昂贵的测试运行,但它非常稳定。我个人承认此刻手动做了很多这样的事情;我们有一个将应用所有脚本(包括基线)的内部迁移工具,因此测试数据库设置和DAL测试是分开的步骤。它虽然工作。如果你想确保创建了一个表,没有比实际尝试向其中插入数据更好的方法了!

您可以尝试通过查看系统目录,并INFORMATION_SCHEMA意见等来验证结果,但最终只有这样,才能确保它实际上工作是尽量使用新对象。仅仅因为物体在那里并不意味着它们是功能性的。

+0

谢谢。这就是我们如何结束这样做的。我们现在在两个独立的程序集中进行测试 - 一个用于正常测试,另一个用于集成测试。第一批在迁移之前运行,并测试应用程序逻辑和内容以及迁移,然后运行迁移,然后进行集成测试。这确保我们始终使用当前(最新)架构并且已创建所有数据库对象。集成测试使用NH模型类并仅执行一些CRUD操作。 – 2010-05-05 07:51:55

0

这也许凭证可以帮助你:

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

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

+0

不,这不是我说的那种迁移。 :)我不想将数据库从一台服务器迁移到另一台服务器。我正在谈论Rails移植中的迁移。我为Migrator.NET项目添加了一个超链接,希望能够为其他人澄清一下。 – 2010-02-26 10:25:08

1

源代码控制是采取当前的代码库的快照。迁移是为了将数据库从一个版本转移到另一个版本。因此,在未来的某个时刻,您可以使用旧的数据库,应用迁移并使用最新的代码库。

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

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

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

+0

这只适用于简单的1:1模型,我们的数据库具有与域模型类不同的结构。我看到你的例子是在Ruby中(是rspec?),这将与ActiveRecord一起工作,但我们没有使用它。我们使用NHibernate将数据库表映射到我们的域模型实体,并且它们不匹配1:1。 – 2010-03-03 14:20:38

+0

是的,它是rspec。 如果是这样的话,我可能会做一下Rawheiser的建议,只是锻炼模型。使用.net很难做到,但是如果你已经建立了一个开发和测试数据库,那么做起来会更容易。如果映射不是1:1,那么花时间设置一个干净的测试数据库来运行测试可能会很有用。我仍然没有听说过任何测试迁移的人,只是测试这些迁移的结果。 – 2010-03-03 15:28:48

+0

我给你+1,因为你的答案对ActiveRecord很好。 – 2010-03-04 08:06:12

0

你可以做一个数据库系统对象的比较,但你需要有一个目标来比较 - 否则你怎么知道如果通过或失败?

我认为您可能会更好地创建一组边缘案例CRUD操作测试用例,这些测试用例可以锻炼数据层中的实体或操作。如果其中任何一个失败,数据库就不会与需要的数据同步。即,如果字段char(20)的插入失败,因为它只是数据库中的char(15)。然后可以完成数据库结构比较来查看是否关闭。

您可以通过仅关注最近更改的项目并假设已应用以前的更改来缩短这一点。

1

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

0

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

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