Dokumentacja Celery wspomina o testowaniu Celery w Django, ale nie wyjaśnia, jak przetestować zadanie Celery, jeśli nie używasz Django. Jak Ty to robisz?
python
unit-testing
celery
davidmytton
źródło
źródło
celery.loader.import_default_modules()
.Używam tego:
Dokumenty: http://docs.celeryproject.org/en/3.1/configuration.html#celery-always-eager
CELERY_ALWAYS_EAGER umożliwia synchroniczne uruchamianie zadań i nie potrzebujesz serwera selera.
źródło
ImportError: No module named celeryconfig
.celeryconfig.py
istnieje w jednym pakiecie. Zobacz docs.celeryproject.org/en/latest/getting-started/… .add
z pytania OP wTestCase
klasie?CELERY_TASK_ALWAYS_EAGER
do testów jednostkowych.Zależy od tego, co dokładnie chcesz testować.
źródło
unittest
py.test armatura
Dodatek: spraw, by send_task cieszył się szacunkiem
źródło
Dla tych na Seler 4 to:
Ponieważ nazwy ustawień zostały zmienione i wymagają aktualizacji, jeśli zdecydujesz się na aktualizację, zobacz
https://docs.celeryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
źródło
Od wersji Celery 3.0 jednym ze sposobów ustawienia
CELERY_ALWAYS_EAGER
w Django jest:źródło
Od wersji 4.0 Selera, urządzenia py.test są dostarczane do uruchomienia pracownika selera tylko na czas testu i są wyłączane po zakończeniu:
Wśród innych urządzeń opisanych na http://docs.celeryproject.org/en/latest/userguide/testing.html#py-test możesz zmienić domyślne opcje selera, ponownie definiując
celery_config
urządzenie w ten sposób:Domyślnie proces roboczy testu używa brokera w pamięci i zaplecza wyników. Nie ma potrzeby korzystania z lokalnego Redis lub RabbitMQ, jeśli nie testujesz określonych funkcji.
źródło
odniesienie using pytest.
jeśli używasz flask, ustaw plik config
i w
conftest.py
źródło
W moim przypadku (i zakładam wiele innych) chciałem tylko przetestować wewnętrzną logikę zadania za pomocą pytest.
TL; DR; skończyło się wyszydzaniem wszystkiego ( OPCJA 2 )
Przykład zastosowania :
proj/tasks.py
tests/test_tasks.py
ale ponieważ
shared_task
dekorator ma dużo wewnętrznej logiki selera, tak naprawdę nie jest to test jednostkowy.Tak więc dla mnie były 2 opcje:
OPCJA 1: Oddzielna logika wewnętrzna
proj/tasks_logic.py
proj/tasks.py
Wygląda to bardzo dziwnie i poza tym, że jest mniej czytelny, wymaga ręcznego wyodrębnienia i przekazania atrybutów, które są częścią żądania, na przykład
task_id
w razie potrzeby, co sprawia, że logika jest mniej czysta.OPCJA 2: kpi z
wyszydzania wnętrzności selera
tests/__init__.py
co następnie pozwala mi na mockowanie obiektu żądania (ponownie, jeśli potrzebujesz rzeczy z żądania, takich jak identyfikator lub licznik ponownych prób.
tests/test_tasks.py
To rozwiązanie jest znacznie bardziej ręczne, ale daje mi kontrolę, której potrzebuję, aby wykonać testy jednostkowe , bez powtarzania się i bez utraty celownika.
źródło