I have a django project that used django-nose. I'd like to add django-celery to the project. I use unit tests. Both django-nose and django-celery need a TEST_RUNNER setting in my settings.py file. Specifically:
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
for django-nose and:
TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'
for django-celery.
How should I handle this so that I can use both packages?
If you're able to isolate your tests into celery and non-celery dependent functionality, you could try overriding settings on the test classes that invoke celery tasks:
while the NoseTestRunner would be set as the default in settings.py
I found that the best way to handle this is to skip the Celery test runner. I just use decorate my celery-using tests with a
@override_settings(CELERY_ALWAYS_EAGER=True)
and everything gets tested nicely.You can subclass Celery runner and Nose runner, then you get good sides for all of them.
Then in your settings:
Why it works:
You get:
The test CeleryTestRunner did nothing just setting some config and then call
super().setup_test_environment()
. Then the super will looking for setup_test_environment() in that chain.Watch the video from Raymond Hettinger: super considered super(here).