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.pyexiste en el paquete de uno. Consulte docs.celeryproject.org/en/latest/getting-started/… .adddesde la pregunta de OP dentro de unaTestCaseclase?CELERY_TASK_ALWAYS_EAGERpruebas 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_EAGERen 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_configaccesorio 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.pyfuente
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.pytests/test_tasks.pypero desde
shared_taskdecorador 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.pyproj/tasks.pyEsto 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_iden 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__.pyque 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.pyEsta 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