Dokumentasi Celery menyebutkan pengujian Celery dalam Django tetapi tidak menjelaskan bagaimana menguji tugas Celery jika Anda tidak menggunakan Django. Bagaimana kamu melakukan ini?
python
unit-testing
celery
davidmytton
sumber
sumber
celery.loader.import_default_modules()
.Saya menggunakan ini:
Docs: http://docs.celeryproject.org/en/3.1/configuration.html#celery-always-eager
CELERY_ALWAYS_EAGER memungkinkan Anda menjalankan tugas secara sinkron, dan Anda tidak memerlukan server seledri.
sumber
ImportError: No module named celeryconfig
.celeryconfig.py
ada dalam paket seseorang. Lihat docs.celeryproject.org/en/latest/getting-started/… .add
dari pertanyaan OP di dalamTestCase
kelas?CELERY_TASK_ALWAYS_EAGER
untuk pengujian unit.Tergantung pada apa sebenarnya yang ingin Anda uji.
sumber
unittest
perlengkapan py.test
Tambahan: buat send_task respek menjadi bersemangat
sumber
Bagi mereka yang menggunakan Celery 4 itu:
Karena nama pengaturan telah diubah dan perlu diperbarui jika Anda memilih untuk meningkatkan, lihat
https://docs.celeryproject.org/en/latest/history/whatsnew-4.0.html?highlight=what%20is%20new#lowercase-setting-names
sumber
Pada Seledri 3.0 , salah satu cara untuk mengatur
CELERY_ALWAYS_EAGER
di Django adalah:sumber
Sejak Celery v4.0 , perlengkapan py.test disediakan untuk memulai pekerja seledri hanya untuk pengujian dan akan ditutup setelah selesai:
Di antara perlengkapan lain yang dijelaskan di http://docs.celeryproject.org/en/latest/userguide/testing.html#py-test , Anda dapat mengubah opsi default seledri dengan mendefinisikan ulang
celery_config
perlengkapan dengan cara ini:Secara default, pekerja pengujian menggunakan broker dalam memori dan hasil backend. Tidak perlu menggunakan Redis atau RabbitMQ lokal jika tidak menguji fitur tertentu.
sumber
referensi menggunakan pytest.
jika Anda menggunakan flask, setel konfigurasi aplikasi
dan masuk
conftest.py
sumber
Dalam kasus saya (dan saya berasumsi banyak orang lain), yang saya inginkan hanyalah menguji logika batin tugas menggunakan pytest.
TL; DR; akhirnya mengejek semuanya ( OPSI 2 )
Contoh Kasus Penggunaan :
proj/tasks.py
tests/test_tasks.py
tetapi, karena
shared_task
dekorator melakukan banyak logika internal seledri, ini sebenarnya bukan pengujian unit.Jadi, bagi saya, ada 2 opsi:
OPSI 1: Pisahkan logika internal
proj/tasks_logic.py
proj/tasks.py
Ini terlihat sangat aneh, dan selain membuatnya kurang dapat dibaca, ini juga memerlukan secara manual mengekstrak dan meneruskan atribut yang merupakan bagian dari permintaan, misalnya
task_id
jika Anda membutuhkannya, yang membuat logikanya kurang murni.OPSI 2:
mengejek bagian dalam seledri
tests/__init__.py
yang kemudian memungkinkan saya untuk memalsukan objek permintaan (sekali lagi, jika Anda memerlukan sesuatu dari permintaan, seperti id, atau penghitung percobaan ulang.
tests/test_tasks.py
Solusi ini jauh lebih manual, tetapi, ini memberi saya kontrol yang saya perlukan untuk benar-benar menguji unit , tanpa mengulang sendiri, dan tanpa kehilangan ruang lingkup seledri.
sumber