Führe einen Sellerie-Arbeiter aus, der sich mit der Django Test-Datenbank verbindet

8

HINTERGRUND: Ich arbeite an einem Projekt, das Sellerie verwendet, um Aufgaben zu planen, die zu einem bestimmten Zeitpunkt in der Zukunft ausgeführt werden. Diese Aufgaben drücken den Status der Final State Machine nach vorne. Hier ist ein Beispiel:

  • Eine zukünftige Erinnerung wird voraussichtlich in zwei Tagen an den Benutzer gesendet.
  • Wenn diese geplante Aufgabe ausgeführt wird, wird eine E-Mail gesendet, und die FSM wird zum nächsten Status
  • weitergeleitet
  • Der nächste Status besteht darin, eine Erinnerung für die Ausführung in zwei weiteren Tagen zu planen
  • Wenn diese Aufgabe ausgeführt wird, sendet sie eine weitere E-Mail mit dem Status advance
  • usw. ...

Ich verwende derzeit CELERY_ALWAYS_EAGER, wie von dieser SO-Antwort

vorgeschlagen

Das Problem bei der Verwendung dieser Technik in Tests besteht darin, dass der Aufgabencode, der in einem separaten Thread ausgeführt werden soll, in demselben ausgeführt wird wie der, der ihn plant. Dies führt dazu, dass der FSM-Status nicht richtig gespeichert wird und das Testen erschwert wird. Ich konnte nicht feststellen, was genau das verursacht, aber es scheint, als würden Sie unten im Call-Stack den aktuellen Status speichern, aber wenn Sie den Call-Stack zurückgeben, wird ein vorheriger Status gespeichert. Ich könnte möglicherweise mehr Zeit damit verbringen zu bestimmen, was schief läuft, wenn der Code nicht läuft, wie es sollte, aber es scheint logischer zu sein, zu versuchen, den Code so laufen zu lassen, wie er sollte und sicherzustellen, dass er tut, was er sollte.

FRAGE: Ich würde daher gerne wissen, ob es eine Möglichkeit gibt, eine volle Sellerie-Einstellung zu erstellen, die django während eines Testlaufs verwenden kann. Wenn es automatisch ausgeführt werden könnte, wäre das ideal, aber sogar ein manuelles Eingreifen wäre besser, als das Verhalten von Hand zu testen. Ich denke, dass etwas möglich sein könnte, wenn ich eine Pause in den Tests mache, den Sellerie-Arbeiter zur Verbindung mit der Test-DB aufreiße, den Django-Test fortsetze. Hat jemand schon mal so etwas probiert?

    
Andres 17.12.2013, 15:54
quelle

1 Antwort

1

Was Sie zu tun versuchen, ist kein Komponententest, sondern ein Funktions- / Integrationstest.

Ich würde empfehlen, ein BDD-Framework (Behave, Lettuce) zu verwenden und BDD-Tests von einem CI-Server (TravisCI oder Jenkins) gegen einen externen Server (z. B. Staging-Umgebung) auszuführen.

So könnte der Prozess sein:

  1. Push ändert sich in GitHub
  2. GitHub startet auf dem CI-Server
  3. Der CI-Server führt Komponententests durch
  4. Der CI-Server wird für die Integrationsumgebung bereitgestellt (oder für die Bereitstellung, falls Sie keine Integration haben)
  5. Der CI-Server führt Ende-zu-Ende-Tests der Integration mit dem neuen implementierten Code durch
  6. Wenn alles erfolgreich ist, wird dieser Build auf "Kann in der Produktion bereitgestellt werden" oder etwas Ähnliches
  7. befördert
Richard Knop 31.01.2014 14:59
quelle