La documentación de Celery menciona probar Celery dentro de Django, pero no explica cómo probar una tarea de Celery si no está usando Django. ¿Cómo haces esto?
python
unit-testing
celery
Davidmytton
fuente
fuente
celery.loader.import_default_modules()
.Yo uso esto:
Documentos: http://docs.celeryproject.org/en/3.1/configuration.html#celery-always-eager
CELERY_ALWAYS_EAGER le permite ejecutar su tarea sincrónicamente y no necesita un servidor de apio.
fuente
ImportError: No module named celeryconfig
.celeryconfig.py
existe en el paquete de uno. Consulte docs.celeryproject.org/en/latest/getting-started/… .add
desde la pregunta de OP dentro de unaTestCase
clase?CELERY_TASK_ALWAYS_EAGER
pruebas unitarias.Depende de lo que quieras probar exactamente.
fuente
prueba de unidad
accesorios de py.test
Anexo: haga que send_task respete ansioso
fuente
Para aquellos en Apio 4 es:
Debido a que los nombres de las configuraciones se han cambiado y deben actualizarse si decide actualizar, consulte
https://docs.celeryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
fuente
A partir de apio 3.0 , una forma de configurar
CELERY_ALWAYS_EAGER
en Django es:fuente
Desde Celery v4.0 , se proporcionan accesorios de py.test para iniciar un trabajador de apio solo para la prueba y se apagan cuando termina:
Entre otros accesorios descritos en http://docs.celeryproject.org/en/latest/userguide/testing.html#py-test , puede cambiar las opciones predeterminadas de apio redefiniendo el
celery_config
accesorio de esta manera:De forma predeterminada, el trabajador de pruebas usa un intermediario en memoria y un backend de resultados. No es necesario utilizar un Redis o RabbitMQ local si no se están probando funciones específicas.
fuente
referencia usando pytest.
si usa un matraz, configure la configuración de la aplicación
y en
conftest.py
fuente
En mi caso (y supongo que en muchos otros), todo lo que quería era probar la lógica interna de una tarea usando pytest.
TL; DR; Terminó burlándose de todo ( OPCIÓN 2 )
Ejemplo de caso de uso :
proj/tasks.py
tests/test_tasks.py
pero desde
shared_task
decorador hace mucha lógica interna de apio, no es realmente una prueba unitaria.Entonces, para mí, había 2 opciones:
OPCIÓN 1: Lógica interna separada
proj/tasks_logic.py
proj/tasks.py
Esto parece muy extraño y, además de hacerlo menos legible, requiere extraer y pasar manualmente los atributos que forman parte de la solicitud, por ejemplo,
task_id
en caso de que lo necesite, lo que hace que la lógica sea menos pura.OPCIÓN 2:
burlarse de las partes internas del apio
tests/__init__.py
que luego me permite simular el objeto de la solicitud (nuevamente, en caso de que necesite cosas de la solicitud, como la identificación o el contador de reintentos.
tests/test_tasks.py
Esta solución es mucho más manual, pero me da el control que necesito para realizar una prueba unitaria , sin repetirme y sin perder el alcance del apio.
fuente