2012-01-10 3 views
6

Czy ktoś zna sposób przetestowania migracji sam po napisaniu go? Bardzo wiele razy w moim DataMigrations Znalazłem głupie subtelne błędy, jak True zamiast False dla wartości domyślnej niepowołane denormalizations itpTestowanie migracji na południe w Django

Domyślna konwencja Południowa jest, aby rozpocząć migrację z numerami, więc nie można nawet importuj je bez użycia __import__. Czy ktoś wymyślił podobny problem? Jak ludzie je rozwiązują?

Najbardziej oczywistym podejściem byłoby trzymanie logiki migracji w oddzielnym importowanym module i testowanie tego, ale to jest nieco niezgrabne.

+0

Dlaczego po prostu nie pisać testów jednostkowych, które testują nowy schemat? np. utwórz model bez określania wartości i sprawdź, czy jest używana poprawna wartość domyślna. –

+0

@Michael: To jest dobre dla schemamigracji, ale nie znajdzie błędu w datamigracjach. – jammon

+0

W takim przypadku można utworzyć bazę danych do testowania migracji, wypełnić przykładowymi danymi, przeprowadzić migrację i przetestować wartości końcowe. –

Odpowiedz

2

Natknąłem się na ten sam problem. Ponieważ nie znaleźć sposób, aby zrobić testy na datamigrations użyłem twierdzeń wykryć uszkodzone dane:

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, to trochę niezgrabne. Ale wydaje się, że działa.

[Edytuj] Pomyśl o tym jeszcze raz, znalazłem o wiele lepsze rozwiązanie: umieść testy w samej DataMigration. Ponieważ migracja jest jednorazowym kodem, nie trzeba jej testować w kółko.

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

Nie wiem, mieszacie rzeczy, które nie powinny być razem, testy to jedno, a migracje to kolejne .... – Arruda

0

Jestem dość nowy na południu, ale kilka razy użyłem go, użyłem również testów jednostkowych, a następnie, ./ manage.py test wykonał również migracje, to już znalazłoby wiele błędów.

Jednak to prawdopodobnie nie działa we wszystkich przypadkach (myślę, że nie ma danych w testowej bazie danych podczas wykonywania tych migracji).