A documentação do Celery menciona o teste do Celery dentro do Django, mas não explica como testar uma tarefa do Celery se você não estiver usando o Django. Como você faz isso?
python
unit-testing
celery
davidmytton
fonte
fonte
celery.loader.import_default_modules()
.Eu uso isso:
Documentos: http://docs.celeryproject.org/en/3.1/configuration.html#celery-always-eager
CELERY_ALWAYS_EAGER permite que você execute sua tarefa de forma síncrona e você não precisa de um servidor de celery.
fonte
ImportError: No module named celeryconfig
.celeryconfig.py
existe em um pacote. Consulte docs.celeryproject.org/en/latest/getting-started/… .add
da pergunta do OP em umaTestCase
classe?CELERY_TASK_ALWAYS_EAGER
para testes de unidade.Depende do que exatamente você deseja testar.
fonte
teste de unidade
py.test fixtures
Adendo: faça com que send_task respeite ansioso
fonte
Para quem está no Celery 4, é:
Como os nomes das configurações foram alterados e precisam ser atualizados se você optar por atualizar, consulte
https://docs.celeryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
fonte
A partir do Celery 3.0 , uma maneira de definir
CELERY_ALWAYS_EAGER
no Django é:fonte
Desde o Celery v4.0 , os acessórios py.test são fornecidos para iniciar um trabalhador de aipo apenas para o teste e são desligados quando concluído:
Entre outros acessórios descritos em http://docs.celeryproject.org/en/latest/userguide/testing.html#py-test , você pode alterar as opções padrão de aipo redefinindo o
celery_config
acessório desta forma:Por padrão, o trabalhador de teste usa um broker na memória e back-end de resultado. Não há necessidade de usar um Redis ou RabbitMQ local se não estiver testando recursos específicos.
fonte
referência usando pytest.
se você usar o flask, defina a configuração do aplicativo
e em
conftest.py
fonte
No meu caso (e suponho que muitos outros), tudo que eu queria era testar a lógica interna de uma tarefa usando o pytest.
TL; DR; acabou zombando de tudo ( OPÇÃO 2 )
Exemplo de caso de uso :
proj/tasks.py
tests/test_tasks.py
mas desde
shared_task
decorador faz muita lógica interna de aipo, não é realmente um teste de unidade.Então, para mim, havia 2 opções:
OPÇÃO 1: lógica interna separada
proj/tasks_logic.py
proj/tasks.py
Isso parece muito estranho e, além de torná-lo menos legível, é necessário extrair e transmitir manualmente os atributos que fazem parte da solicitação, por exemplo,
task_id
, caso você precise, o que torna a lógica menos pura.OPÇÃO 2:
zombando de partes internas de aipo
tests/__init__.py
que me permite simular o objeto de solicitação (novamente, no caso de você precisar de coisas da solicitação, como o id ou o contador de novas tentativas.
tests/test_tasks.py
Esta solução é muito mais manual, mas me dá o controle que preciso para testar de fato a unidade , sem me repetir e sem perder o alcance do aipo.
fonte