I‘ Habe den Code gelesen. Ein Blick auf LiveServerTestCase
für die Inspiration macht Sinn, aber versuchen, etwas zu kochen, indem man verlängert oder irgendwie ruft LiveServerTestCase
fordert Ärger und erhöhte Wartungskosten.
Eine robuste Art und Weise ausgeführt werden, welche sieht wie das, was LiveServerTestCase
tut, ist aus unittest.TestCase
ein Testfall-Klasse mit benutzerdefinierten setUpClass
und tearDownClass
Methoden zu erstellen. Die setUpClass
Methode:
Stellt eine Instanz der Django-Anwendung mit geeigneten Einstellungen für die Prüfung auf: eine Datenbank in einem Ort, der mit irgendetwas stört nicht anders, Protokolle an der entsprechenden Stelle aufgezeichnet und, wenn E-Mails während des normalen Betriebs gesendet wird, mit E-Mail-Einstellungen, die nicht dazu führen, dass Ihre Systemadministratoren Sie strangulieren wollen usw.
[Tatsächlich ist dies ein Deployment-Verfahren. Da wir unsere Anwendung schließlich bereitstellen möchten, ist der oben beschriebene Prozess einer, den wir entwickeln sollten auf jeden Fall.]
Laden Sie alle erforderlichen Fixtures in die Datenbank.
Startet eine Gunicorn-Instanz, die diese Instanz der Django-Anwendung unter Verwendung der üblichen OS-Befehle ausführt.
Die tearDownClass
:
Fährt die Gunicorn Instanz, wieder normale OS-Befehle.
Löscht die Datenbank, die für den Test erstellt wurde, löscht, was Protokolldateien erstellt wurde, usw.
Und zwischen der Einrichtung und unsere Tests Teardown auf dem Hafen, die Anwendung in Verbindung, um Gunicorn zugewiesen und Sie laden mehr Fixtures, wenn nötig, etc.
Warum nicht versuchen, eine modifizierte LiveServerTestCase
zu verwenden?
LiveServerTestCase
umfasst die gesamte Meßaufbau in einem Prozess: die Tests, die WSGI-Server und die Django Anwendung. Gunicorn ist nicht für den Betrieb so konzipiert.Zum einen verwendet es einen Master-Prozess und Worker-Prozesse.
Wenn LiveServerTestCase
geändert wird, um irgendwie die Django-App in einem externen Prozess zu starten, dann gehen ein gutes Stück der Vorteile dieser Klasse aus dem Fenster. LiveServerTestCase
setzt auf die Tatsache, dass es nur Einstellungen oder Datenbankverbindungen in seinem Prozessraum ändern kann und dass diese Änderungen auf die Django-App übertragen werden, da es in demselben Prozess lebt. Wenn sich die App in einem anderen Prozess befindet, können diese Tricks nicht funktionieren. Sobald LiveServerTestCase
geändert wird, um sich darum zu kümmern, ist das Endergebnis nah an dem, was ich oben umrissen habe.
Zusätzlich: Könnte jemand bekommen Gunicorn und Django im gleichen Prozess laufen?
Ich bin sicher, jemand könnte kleben sie zusammen, aber bedenken Sie Folgendes. Dies würde sicherlich bedeuten, den Kern Code von Gunicorn zu ändern, da Gunicorn entworfen ist, Master und Worker-Prozesse zu verwenden. Dann wäre diese Person, die den Klebstoff hergestellt hat, dafür verantwortlich, diesen Klebstoff auf dem neuesten Stand zu halten, wenn sich das Innere von Gunicorn oder Django so verändert, dass der Klebstoff bricht. Am Ende des Tages erfordert dies mehr Arbeit als die am Anfang dieser Antwort beschriebene Methode.
LiveServerTestCase wird als Thread ausgeführt https://github.com/django/django/blob/master/django/test/testcases.py#L1009 –
Wenn Sie ein '' LiveServerTestCase'' ausführen, startet Django seine eigene WSGI Server. Brauchst du wirklich Gunicorn für das, was du versuchst zu tun? – Louis
Ja, weil ich SSL und andere Produktionsfunktionen brauche, die der WSGI-Server Django nicht bietet. –