La documentation de Celery mentionne le test de Celery dans Django mais n'explique pas comment tester une tâche Celery si vous n'utilisez pas Django. Comment est-ce que tu fais ça?
la source
La documentation de Celery mentionne le test de Celery dans Django mais n'explique pas comment tester une tâche Celery si vous n'utilisez pas Django. Comment est-ce que tu fais ça?
Il est possible de tester des tâches de manière synchrone en utilisant n'importe quelle bibliothèque unittest disponible. Je fais normalement 2 sessions de test différentes lorsque je travaille avec des tâches de céleri. Le premier (comme je le suggère ci-dessous) est complètement synchrone et devrait être celui qui garantit que l'algorithme fait ce qu'il doit faire. La deuxième session utilise tout le système (y compris le courtier) et s'assure que je n'ai pas de problèmes de sérialisation ou de tout autre problème de distribution ou de communication.
Alors:
from celery import Celery
celery = Celery()
@celery.task
def add(x, y):
return x + y
Et votre test:
from nose.tools import eq_
def test_add_task():
rst = add.apply(args=(4, 4)).get()
eq_(rst, 8)
J'espère que cela pourra aider!
celery.loader.import_default_modules()
.J'utilise ceci:
Documents: http://docs.celleryproject.org/en/3.1/configuration.html#celery-always-eager
CELERY_ALWAYS_EAGER vous permet d'exécuter votre tâche de manière synchrone, et vous n'avez pas besoin d'un serveur de céleri.
la source
ImportError: No module named celeryconfig
.celeryconfig.py
existe dans son package. Voir docs.celleryproject.org/en/latest/getting-started/… .add
partir de la question d'OP au sein d'uneTestCase
classe?CELERY_TASK_ALWAYS_EAGER
pour les tests unitaires.Cela dépend exactement de ce que vous voulez tester.
la source
Test de l'unité
Appareils py.test
Addendum: rendre le respect de send_task impatient
la source
Pour ceux sur Celery 4 c'est:
Étant donné que les noms des paramètres ont été modifiés et doivent être mis à jour si vous choisissez de mettre à niveau, consultez
https://docs.celleryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
la source
Depuis Celery 3.0 , une façon de définir
CELERY_ALWAYS_EAGER
dans Django est:la source
Depuis Celery v4.0 , les appareils py.test sont fournis pour démarrer un ouvrier céleri juste pour le test et sont arrêtés une fois terminé:
Parmi les autres appareils décrits sur http://docs.celleryproject.org/en/latest/userguide/testing.html#py-test , vous pouvez modifier les options par défaut du céleri en redéfinissant l'
celery_config
appareil de cette façon:Par défaut, le test worker utilise un courtier en mémoire et un backend de résultats. Pas besoin d'utiliser un Redis ou RabbitMQ local si vous ne testez pas des fonctionnalités spécifiques.
la source
référence utilisant pytest.
si vous utilisez flask, définissez la configuration de l'application
et en
conftest.py
la source
Dans mon cas (et je suppose que beaucoup d'autres), tout ce que je voulais, c'était tester la logique interne d'une tâche en utilisant pytest.
TL, DR; a fini par se moquer de tout ( OPTION 2 )
Exemple de cas d'utilisation :
proj/tasks.py
tests/test_tasks.py
mais, puisque le
shared_task
décorateur fait beaucoup de logique interne au céleri, ce n'est pas vraiment un test unitaire.Donc, pour moi, il y avait 2 options:
OPTION 1: Logique interne séparée
proj/tasks_logic.py
proj/tasks.py
Cela semble très étrange, et à part le rendre moins lisible, cela nécessite d'extraire et de transmettre manuellement les attributs qui font partie de la requête, par exemple
task_id
au cas où vous en auriez besoin, ce qui rend la logique moins pure.OPTION 2: se
moque de se moquer des internes de céleri
tests/__init__.py
ce qui me permet ensuite de me moquer de l'objet de la requête (encore une fois, au cas où vous auriez besoin d'éléments de la requête, comme l'id ou le compteur de tentatives.
tests/test_tasks.py
Cette solution est beaucoup plus manuelle, mais elle me donne le contrôle dont j'ai besoin pour effectuer un test unitaire , sans me répéter, et sans perdre la lunette céleri.
la source