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