Как unit test datamigration Django South "

Я создал миграцию данных с помощью юга, которая принимает таблицу версий и преобразует ее из:

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

в более простой:

name: 1.2.3.a

Теперь я хочу протестировать эту datamigration с помощью модульного тестирования django (1.3beta).

Как я могу использовать юг программно, чтобы перематывать миграции вперед и назад при указании настраиваемых приборов для использования, которые я могу проверить?

Ответ 1

Я задал этот вопрос в IRC Django South, но на самом деле не получил ответа; они действительно заставляли меня подвергать сомнению "почему" модульных испытаний на миграцию данных (так как это обычно одно время, и вы все равно не собираетесь его реорганизовывать, так что вы можете также провести ручную проверку).

Однако я нашел 2 причины для "реального тестирования":

  • Написание моих предположений вниз заставляет меня быть явным, следовательно, скорее всего, будет правильным.
  • Я могу прочитать о предположениях в каком-то месте, кроме фактического кода (что осложняется довольно большой datamigration)

В конце концов, я просто решил использовать ряд утверждений (т.е. регулярный оператор python) в конце datamigration. У этого есть преимущества, упомянутые выше, и дополнительное преимущество выполнения откат, если одно из утверждений терпит неудачу и говорит вам, какая именно часть действительности не похожа на то, что вы ожидали.

Ответ 2

Это не действительно unit test: это какой-то другой тип теста... Это означает, что вам, вероятно, придется смотреть за рамки обычных модулей тестирования модулей - хотя, конечно, вы можете использовать существующие инструменты для создайте то, что хотите.

Что бы я сделал, это создать совершенно новый тестовый набор вдали от моих обычных тестов django и определить атрибут в каждом тесте, определяющий его "продолжительность жизни": первую и последнюю миграции, для которых вы ожидаете, что она пройдет.

Затем напишите script, который в основном делает это:

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

Вы можете использовать декоратор, чтобы указать "продолжительность жизни" для каждого теста, возможно, расширив эту концепцию декоратора "включить/отключить" для сравнения текущий номер миграции (который вы должны где-то хранить где-нибудь) с проверками, которые вы ожидаете передать, и попросите его обменять результат с ошибкой/неудачей (поэтому, если тест проходит за пределами его срока службы, декоратор заставляет его терпеть неудачу и наоборот).

Чтобы протестировать обратные миграции, просто используйте ту же схему, но запустите цикл назад.