10

我使用南创建了一个数据迁移,它采用版本表并将其转换为:

major: 1, minor: 2, micro: 3, release: a

变成一个更简单的:

name: 1.2.3.a

现在我想使用 django 单元测试(1.3beta)来测试这个数据迁移。

如何以编程方式使用 south 来向前和向后滚动迁移,同时指定要使用的自定义装置,我可以验证?

4

2 回答 2

5

我在 Django South IRC 上问过这个问题,但并没有真正得到答案;他们确实让我质疑单元测试数据迁移的“原因”(因为它通常是一次性的事情,无论如何你都不会重构它,所以你不妨做一些手动检查)。

但是,我发现“真正的测试”有两个理由:

  • 事先写下我的假设迫使我变得明确,因此更有可能是正确的。
  • 除了实际代码(对于相当大的数据迁移而言,这很复杂),我可以在其他地方阅读有关假设

最后,我只是决定在数据迁移结束时添加一些断言(即常规 python 语句)。这具有上述优点,以及如果其中一个断言失败并准确告诉您现实的哪一部分与您预期的不一样,则进行回滚的额外优势。

于 2012-05-17T14:38:09.940 回答
2

这不是真正的单元测试:它是某种其他类型的测试......这意味着您可能不得不在正常的单元测试框架之外寻找 - 当然您可以使用现有的工具来构建您想要的东西.

我要做的是从我的正常 django 测试中创建一个全新的测试套件,并在每个测试中定义一个属性来定义它的“生命周期”:您希望它通过的第一次和最后一次迁移。

然后,编写一个基本上执行此操作的脚本:

for m in range(latestMigrationNumber):
    name = findNameOfMigrationNumber(m)   # look in the migrations directory
    executeMigration(name)                # os.system(), subprocess.*, etc
    runTheTests()

您可以使用装饰器为每个测试指定“寿命”,也许通过扩展此“启用/禁用”装饰器概念来比较当前迁移数(您必须将其全局存储在某处)与您希望通过的测试,并让它交换通过/失败结果(因此,如果测试在其生命周期之外通过,装饰器会使其失败,反之亦然)。

要测试向后迁移,只需使用相同的方案,但向后运行循环。

于 2011-09-06T06:43:32.847 回答