I Przeczytałem kod. Patrzenie na LiveServerTestCase
dla inspiracji ma sens, ale próba gotowania czegoś poprzez rozszerzenie lub w jakiś sposób wywołanie LiveServerTestCase
wymaga kłopotów i zwiększonych kosztów utrzymania.
Solidna sposobem uruchomienia które wygląda jak co LiveServerTestCase
robi jest stworzenie z unittest.TestCase
test klasa przypadku niestandardowych setUpClass
i tearDownClass
metod. setUpClass
metoda:
konfiguruje instancję aplikacji Django z ustawieniami odpowiednimi do testowania: bazy danych w miejscu, które nie będą kolidować z niczego innego, logi zapisywane w odpowiednim miejscu, a jeśli są e-maile wysyłane podczas normalnych operacji, z ustawieniami wiadomości e-mail, które nie spowodują, że twoi administratorzy chcą cię udusić, itp.
[W rzeczywistości jest to procedura wdrażania. Ponieważ chcemy ostatecznie wdrożyć naszą aplikację, powyższy proces należy rozwinąć w następujący sposób: .]
Załaduj potrzebne urządzenia do bazy danych.
Uruchamia instancję Gunicorn uruchom tę instancję aplikacji Django, używając do tego zwykłych poleceń systemu operacyjnego.
tearDownClass
:
zamyka instancji Gunicorn, ponownie używając zwykłych poleceń systemu operacyjnego.
Usuwa bazę danych, która powstała z myślą o testowaniu, usuwa pliki dziennika cokolwiek mogło zostać utworzone, itp
A pomiędzy konfiguracji i przerywaniem nasze testy skontaktować aplikację na port przypisany do Gunicorn i w razie potrzeby ładują więcej urządzeń itp.
Dlaczego nie spróbować zmodyfikowanej wersji LiveServerTestCase
?
LiveServerTestCase
obejmuje całą konfigurację testową w jednym procesie: testy, serwer WSGI i aplikację Django. Gunicorn nie jest przeznaczony do takiego działania.Po pierwsze wykorzystuje proces główny i procesy robocze.
Jeśli zostanie zmodyfikowane, aby LiveServerTestCase
, aby uruchomić aplikację Django w procesie zewnętrznym, wiele korzyści z tej klasy wyjść przez okno. LiveServerTestCase
polega na na tym, że może on po prostu zmodyfikować ustawienia lub połączenia z bazą danych w swojej przestrzeni procesowej i że te modyfikacje zostaną przeniesione do aplikacji Django, ponieważ jest ona w tym samym procesie. Jeśli aplikacja jest w innym procesie, te sztuczki nie działają. Po zmodyfikowaniu LiveServerTestCase
, aby się tym zająć, wynik końcowy jest zbliżony do tego, co opisałem powyżej.
dodatkowe: Może ktoś się Gunicorn Django i uruchomić w tym samym procesie?
Jestem pewna, że ktoś mógł skleić je razem, ale rozważ następujące. To z pewnością oznaczałoby zmianę kodu rdzenia Gunicorn, ponieważ Gunicorn jest zaprojektowany do korzystania z procesów master i procesów roboczych. Następnie osoba, która stworzyła klej, będzie odpowiedzialna za aktualizację tego kleju, gdy elementy wewnętrzne Gunicorn lub Django ulegną zmianie w taki sposób, że klej się zerwie. Pod koniec dnia robienie tego wymaga więcej pracy niż użycie metody przedstawionej na początku tej odpowiedzi.
LiveServerTestCase jest wykonywany jako wątek https://github.com/django/django/blob/master/django/test/testcases.py#L1009 –
Po uruchomieniu '' LiveServerTestCase'', Django uruchamia własny WSGI serwer. Czy naprawdę potrzebujesz gunicornu do tego, co próbujesz zrobić? – Louis
Tak, ponieważ potrzebuję SSL i innych funkcji produkcyjnych, których nie zapewnia serwer WSGI Django. –