In der Sellerie-Dokumentation wird das Testen von Sellerie in Django erwähnt , es wird jedoch nicht erläutert, wie eine Sellerie-Aufgabe getestet wird, wenn Sie Django nicht verwenden. Wie machst Du das?
quelle
In der Sellerie-Dokumentation wird das Testen von Sellerie in Django erwähnt , es wird jedoch nicht erläutert, wie eine Sellerie-Aufgabe getestet wird, wenn Sie Django nicht verwenden. Wie machst Du das?
Es ist möglich, Aufgaben synchron mit jeder unittest lib da draußen zu testen. Normalerweise mache ich 2 verschiedene Testsitzungen, wenn ich mit Sellerie-Aufgaben arbeite. Der erste (wie ich unten vorschlage) ist vollständig synchron und sollte derjenige sein, der sicherstellt, dass der Algorithmus das tut, was er tun soll. Die zweite Sitzung verwendet das gesamte System (einschließlich des Brokers) und stellt sicher, dass ich keine Serialisierungsprobleme oder andere Verteilungs- oder Kommunikationsprobleme habe.
So:
from celery import Celery
celery = Celery()
@celery.task
def add(x, y):
return x + y
Und dein Test:
from nose.tools import eq_
def test_add_task():
rst = add.apply(args=(4, 4)).get()
eq_(rst, 8)
Hoffentlich hilft das!
celery.loader.import_default_modules()
.Ich benutze das:
Dokumente: http://docs.celeryproject.org/en/3.1/configuration.html#celery-always-eager
Mit CELERY_ALWAYS_EAGER können Sie Ihre Aufgabe synchron ausführen und benötigen keinen Sellerieserver.
quelle
ImportError: No module named celeryconfig
.celeryconfig.py
in einem Paket vorhanden ist. Siehe docs.celeryproject.org/en/latest/getting-started/… .add
aus der OP-Frage innerhalb einerTestCase
Klasse starten können ?CELERY_TASK_ALWAYS_EAGER
für Unit-Tests abhalten .Kommt darauf an, was genau Sie testen möchten.
quelle
Gerätetest
py.test Vorrichtungen
Nachtrag: send_task respektvoll machen
quelle
Für diejenigen auf Sellerie 4 ist es:
Da die Einstellungsnamen geändert wurden und aktualisiert werden müssen, wenn Sie ein Upgrade durchführen möchten, siehe
https://docs.celeryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
quelle
Ab Sellerie 3.0 können Sie
CELERY_ALWAYS_EAGER
in Django Folgendes festlegen :quelle
Seit Celery v4.0 werden py.test-Vorrichtungen bereitgestellt , um einen Sellerie-Arbeiter nur für den Test zu starten, und werden nach Abschluss heruntergefahren:
Unter anderen auf http://docs.celeryproject.org/en/latest/userguide/testing.html#py-test beschriebenen Geräten können Sie die Standardoptionen für Sellerie ändern, indem Sie das
celery_config
Gerät folgendermaßen neu definieren :Standardmäßig verwendet der Testarbeiter einen In-Memory-Broker und ein Ergebnis-Backend. Sie müssen kein lokales Redis oder RabbitMQ verwenden, wenn Sie bestimmte Funktionen nicht testen.
quelle
Referenz mit Pytest.
Wenn Sie flask verwenden, stellen Sie die App-Konfiguration ein
und in
conftest.py
quelle
In meinem Fall (und ich nehme viele andere an) wollte ich nur die innere Logik einer Aufgabe mit pytest testen.
TL; DR; am Ende verspottete alles ( OPTION 2 )
Anwendungsbeispiel :
proj/tasks.py
tests/test_tasks.py
Da der
shared_task
Dekorateur jedoch viel Sellerie-interne Logik ausführt, handelt es sich nicht wirklich um Unit-Tests.Für mich gab es also zwei Möglichkeiten:
OPTION 1: Separate interne Logik
proj/tasks_logic.py
proj/tasks.py
Dies sieht sehr seltsam aus und erfordert nicht nur eine geringere Lesbarkeit, sondern auch das manuelle Extrahieren und Übergeben von Attributen, die Teil der Anforderung sind, z. B. für den
task_id
Fall, dass Sie sie benötigen, wodurch die Logik weniger rein wird.OPTION 2:
Verspottet Sellerie-Einbauten
tests/__init__.py
Dadurch kann ich das Anforderungsobjekt verspotten (erneut, falls Sie Dinge aus der Anforderung benötigen, wie z. B. die ID oder den Wiederholungszähler.
tests/test_tasks.py
Diese Lösung ist viel manueller, gibt mir aber die Kontrolle, die ich für einen Unit- Test benötige , ohne mich zu wiederholen und ohne den Umfang des Selleries zu verlieren.
quelle