Как провести юнит-тест Django South "datamigration" - PullRequest
10 голосов
/ 25 января 2011

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

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

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

name: 1.2.3.a

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

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

Ответы [ 2 ]

5 голосов
/ 17 мая 2012

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

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

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

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

2 голосов
/ 06 сентября 2011

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

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

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

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

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

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

...