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:
Ich verwende derzeit CELERY_ALWAYS_EAGER, wie von dieser SO-Antwort
vorgeschlagenDas 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?
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:
Tags und Links python django multithreading celery testing