2008-09-26 17 views
6

Chcę napisać testy, które mogą pokazać, czy baza danych jest zsynchronizowana z moim plikiem models.py. Właściwie to już je napisałem, tylko po to, aby dowiedzieć się, że django tworzy nową bazę danych za każdym razem, gdy testy są uruchamiane w oparciu o plik models.py. Czy istnieje sposób, aby wykonać test models.py test użyć istniejącego schematu bazy danych? Ten, który jest w mysql/postgresql, a nie ten w/myapp/models.py?Jak przetestować schemat bazy danych django?

Nie interesują mnie dane znajdujące się w bazie danych, zależy mi tylko na tym, aby to był schemat tj. Chcę, aby moje testy zwróciły uwagę, jeśli tabela w bazie danych ma mniej pól niż schemat w moim pliku models.py .

Używam struktury unittest (w rzeczywistości rozszerzenie django do niej), jeśli ma to jakiekolwiek znaczenie.

dzięki

Odpowiedz

8

Co zrobiliśmy było zastąpić domyślny test_runner tak, że nie byłoby utworzyć nową bazę danych, aby przetestować przeciwko. W ten sposób uruchamia test, niezależnie od tego, jak wygląda nasza obecna lokalna baza danych. Zachowaj jednak ostrożność, jeśli używasz tej metody, ponieważ wszelkie zmiany danych, które wprowadzisz w testach, będą trwałe. Upewniłem się, że wszystkie nasze testy przywracają wszelkie zmiany do pierwotnego stanu i zachowują naszą pierwotną wersję naszej bazy danych na serwerze i mają kopię zapasową.

Tak, aby to zrobić trzeba skopiować RUN_TEST metodę z django.test.simple do lokalizacji w projekcie - kładę kopalnię w myproject/test/test_runner.py

Następnie należy dokonać następujących zmian że metoda:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

Upewnij się, aby zrobić wszystkie niezbędne importu na górze, a następnie w ustawieniach file wybrać ustawienie:

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

teraz po uruchomieniu. Test /manage.py Django uruchomi testy w oparciu o bieżący stan bazy danych, zamiast tworzyć nową wersję na podstawie aktualnych definicji modeli. Metoda

Inną rzeczą, jaką możesz zrobić, to utworzyć kopię bazy danych lokalnie, a następnie wykonaj test w nowej RUN_TEST() tak:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

Dzięki temu nie ma niebezpieczeństwa prowadzenia testów przeciw główna baza danych.

Powiązane problemy