2013-01-21 4 views
11

Ich betreibe eine App in Django mit Gunicorn. Ich versuche Selen zu verwenden, um meine App zu testen, habe aber ein Problem festgestellt.Wie richte ich einen Django-Test-Server ein, wenn ich Gunicorn verwende?

Ich muss einen Testserver erstellen, wie mit Djangos LiveServerTestCase getan wird, die mit Gunicorn arbeiten wird.

Hat jemand irgendwelche Ideen, wie ich das tun könnte?

Anmerkung: könnte auch mir jemand bestätigen, dass LiveServerTestCase als Thread ausgeführt wird kein Prozess

+0

LiveServerTestCase wird als Thread ausgeführt https://github.com/django/django/blob/master/django/test/testcases.py#L1009 –

+1

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

+1

Ja, weil ich SSL und andere Produktionsfunktionen brauche, die der WSGI-Server Django nicht bietet. –

Antwort

1

Off Spitze von meinem Kopf, können Sie versuchen LiveServerTestCase.setUpClass und gunicorn aufzuwickeln außer Kraft zu setzen, anstatt LiveServerThread

2

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:

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

  2. Laden Sie alle erforderlichen Fixtures in die Datenbank.

  3. Startet eine Gunicorn-Instanz, die diese Instanz der Django-Anwendung unter Verwendung der üblichen OS-Befehle ausführt.

Die tearDownClass:

  1. Fährt die Gunicorn Instanz, wieder normale OS-Befehle.

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

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

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

+0

Wie wäre es mit etwas wie https://github.com/kennethreitz/gunicorn-meat/? –

+0

Was, wenn ich Gunicorn und Django auf demselben Prozess laufen lassen möchte? Es erleichtert das Debuggen von Tests. –

+1

Ziel von Gunicorn Meat ist es "Gunicorn von Python zu schreiben". Gunicorn programmatisch aus beliebigem Python - Code starten zu können (zB '' importieren Sie gunicorn_starter; gunicorn_start.start_gunicorn (someconfig) '') würde zu diesem Ziel passen, würde Ihnen aber immer noch nicht erlauben, das zu tun, was * Sie * wollen Tatsache, dass Gunicorn sich in Master- und Slave-Prozesse aufteilen will. – Louis

Verwandte Themen