我使用south创建了一个数据迁移,它采用版本表并将其转换为:
major: 1, minor: 2, micro: 3, release: a
更简单:
name: 1.2.3.a
现在我想使用django单元测试(1.3beta)来测试这个数据迁移。
在指定要使用的自定义灯具时,如何以编程方式向前滚动向前和向后滚动迁移?
答案 0 :(得分:5)
我在Django South IRC上问了这个问题,但没有真正得到答案;他们确实让我质疑单元测试数据迁移的“原因”(因为它通常是一次性的事情而且你无论如何都不会重构它,所以你不妨做一些手动检查。)
但是,我找到了2个“真正测试”的理由:
最后,我决定在数据迁移结束时加入一些断言(即常规python声明)。这具有上述优点,并且如果其中一个断言失败并且确切地告诉您实际的哪个部分与您预期的不同,则执行回滚的额外优势。
答案 1 :(得分:2)
这不是一个真正的单元测试:它是一些其他类型的测试...这意味着你可能不得不在正常的单元测试框架之外看 - 虽然当然你可以使用现有的工具来构建你想要的东西。
我要做的是创建一个全新的测试套件,远离我的普通django测试,并在每个测试中定义一个定义其“寿命”的属性:您希望它通过的第一次和最后一次迁移。 / p>
然后,写一个基本上这样做的脚本:
for m in range(latestMigrationNumber):
name = findNameOfMigrationNumber(m) # look in the migrations directory
executeMigration(name) # os.system(), subprocess.*, etc
runTheTests()
您可以使用装饰器为每个测试指定“生命周期”,可能通过扩展this "enable/disable" decorator concept来比较当前迁移数(您必须在某处全局存储)与您希望通过的测试,并让它交换通过/失败结果(所以如果测试超出其生命周期,装饰器会使其失败,反之亦然)。
要测试向后迁移,只需使用相同的方案,但向后运行循环。