19

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

与应用程序中的任何代码一样,您 必须测试迁移。跌宕起伏的代码。将其作为持续构建过程的一部分,并在尽可能多的不同数据库和环境上进行测试。

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

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

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

4

6 回答 6

6

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

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

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

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

于 2010-03-04T03:04:55.303 回答
2

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

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

此脚本比较两个数据库。(结构和数据)

于 2010-02-25T08:02:41.507 回答
2

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

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

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

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

于 2010-03-02T19:56:55.520 回答
1

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

于 2010-03-04T02:57:06.503 回答
0

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

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

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

于 2010-03-03T05:11:36.390 回答
0

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

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

于 2010-03-16T17:05:15.843 回答