2012-01-10 4 views
6

Кто-нибудь знает способ тестирования самой миграции после ее написания? Очень много раз в моем DataMigrations я нашел тупые тонкие ошибки, как True вместо False для значения по умолчанию, неправильное denormalizations и т.д.Тестирование южных миграций в Django

По умолчанию Южной конвенции, чтобы начать миграцию с числами, так что вы не можете даже импортируйте их без использования __import__. Кто-нибудь придумал подобную проблему? Как люди решают их?

Наиболее очевидным подходом было бы удерживать логику миграции в отдельном импортированном модуле и проверять это, но это несколько неуклюже.

+0

Почему бы просто не написать модульные тесты, проверяющие новую схему? например, создать модель без указания значения и проверить правильность использования по умолчанию. –

+0

@Michael: Это нормально для схем, но он не обнаружит ошибку в данных. – jammon

+0

В этом случае вы можете создать базу данных для тестирования миграции, заполнить примерными данными, запустить миграцию и проверить окончательные значения. –

ответ

2

Я наткнулся на ту же проблему. Так как я не нашел способ сделать тесты для datamigrations, я использовал утверждения для выявления поврежденных данных:

from django.conf import settings 

class MyModel(models.Model): 
    stupid_error = models.BooleanField(default=False) 

    def __init__(self, *args, **kwargs): 
     super(MyModel, self).__init__(*args, **kwargs) 
     if settings.DEBUG: 
      assert not self.stupid_error 

Ok, это немного неуклюжее. Но, похоже, это работает.

[Изменить] Думая об этом еще раз, я нашел гораздо лучшее решение: поместите тесты в сам DataMigration. Поскольку миграция является одноразовым кодом, ее не нужно тестировать снова и снова.

class Migration(DataMigration): 
    def forwards(self, orm): 
     # lots of awesome migration code here 
     # ... 
     for m in orm.MyModel.objects.all(): 
      assert not m.stupid_error 
+0

Не знаю, вы смешиваете материал, который не должен быть вместе, тесты - это одно, а миграции - это еще одно. – Arruda

0

Я довольно новичок на Юге, но несколько раз, когда использовал его, я также использовал модульные тесты, а затем ./ manage.py test выполнил миграцию, это уже нашло много ошибок.

Однако, вероятно, это не работает во всех случаях (я думаю, что нет данных в тестовой базе данных, когда эти миграции выполняются).

Смежные вопросы