2013-01-21 11 views
11

Używam aplikacji w django z gunicorn. Próbuję użyć selenu do przetestowania mojej aplikacji, ale mam problem.Jak skonfigurować serwer testowy django podczas korzystania z gunicorn?

Potrzebuję utworzyć serwer testowy, podobnie jak w przypadku djangos LiveServerTestCase, który będzie działał z gunicorn.

Czy ktoś ma pomysły, jak mogę to zrobić?

uwaga: może również ktoś potwierdzić mi, że LiveServerTestCase jest wykonywany jako nie nitkowym procesowego

+0

LiveServerTestCase jest wykonywany jako wątek https://github.com/django/django/blob/master/django/test/testcases.py#L1009 –

+1

Po uruchomieniu '' LiveServerTestCase'', Django uruchamia własny WSGI serwer. Czy naprawdę potrzebujesz gunicornu do tego, co próbujesz zrobić? – Louis

+1

Tak, ponieważ potrzebuję SSL i innych funkcji produkcyjnych, których nie zapewnia serwer WSGI Django. –

Odpowiedz

1

Off mojej głowie, można spróbować zastąpić LiveServerTestCase.setUpClass i skończyć gunicorn zamiast LiveServerThread

2

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:

  1. 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: .]

  2. Załaduj potrzebne urządzenia do bazy danych.

  3. Uruchamia instancję Gunicorn uruchom tę instancję aplikacji Django, używając do tego zwykłych poleceń systemu operacyjnego.

tearDownClass:

  1. zamyka instancji Gunicorn, ponownie używając zwykłych poleceń systemu operacyjnego.

  2. 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?

  1. 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.

  2. Jeśli zostanie zmodyfikowane, aby LiveServerTestCase, aby uruchomić aplikację Django w procesie zewnętrznym, wiele korzyści z tej klasy wyjść przez okno. LiveServerTestCasepolega 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.

+0

Co powiesz na używanie czegoś takiego jak https://github.com/kennethreitz/gunicorn-meat/? –

+0

Co jeśli chcę uruchomić Gunicorn i Django na tym samym procesie btw? Pomoże to w łatwiejszym debugowaniu testów. –

+1

Celem mięsa Gunicorn jest "pisanie Gunicorn z Pythona". Możliwość programistycznego uruchamiania Gunicorn z dowolnego kodu w Pythonie (np. 'Import gunicorn_starter; gunicorn_start.start_gunicorn (someconfig)' ') zmieściłby się w tym celu, ale nadal nie pozwoliłby ci robić tego, czego * ty * chcesz, ponieważ nic nie zmienia Fakt, że Gunicorn chce się podzielić na procesy panujące i niewolnicze. – Louis

Powiązane problemy