如何对Django South"数据迁移"进行单元测试

Evg*_*eny 10 unit-testing data-migration django-south

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

major: 1, minor: 2, micro: 3, release: a
Run Code Online (Sandbox Code Playgroud)

变得更简单:

name: 1.2.3.a
Run Code Online (Sandbox Code Playgroud)

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

如何指定要使用的自定义夹具,我可以如何以编程方式向前滚动向前和向后滚动迁移?

Kla*_*ven 5

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

但是,我找到了2个"真正测试"的理由:

  • 事先写下我的假设迫使我明确,因此更可能是正确的.
  • 我可以在实际代码之外的某些地方阅读有关假设的信息(这对于相当大的数据迁移来说很复杂)

最后,我简单地决定在数据迁移结束时加入一些断言(即常规python语句).这具有上述优点,并且如果其中一个断言失败并且告诉您确切的哪个部分与您预期的不同,则执行回滚的额外优势.

  • 我认为你所知道的关于确切地知道迁移失败的地点和原因(使用测试)远远好于简单地进行回滚......南方应该为此做好准备......我在网上找到了这个解决方案:http ://micknelson.wordpress.com/2013/03/01/testing-django-migrations/ (2认同)

tan*_*orm 2

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

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

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

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

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

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