Django与Celery 3.1.11的单元测试?
我正在使用Celery 3.1.11和Django 1.6。我一直在搜索,但找不到很多关于Celery(3.1)的近期问题。
我尝试通过manage.py运行单元测试:
>> python manage.py test calculationApp
在我的tests.py文件中,我为计算应用创建了一个任务:
c = calculateCarbon.delay(project.id)
r = AsyncResult(c.id).ready()
print "c.backend: %s" % (c.backend)
print "AsyncResult(c.id).ready(): %s" % (r)
print "AsyncResult(c.id).state: %s" % (AsyncResult(c.id).state)
print "AsyncResult(c.id).result: %s" % (AsyncResult(c.id).result)
while not r:
r = AsyncResult(c.id).ready()
当我运行单元测试时,测试卡在那儿,永远也不会完成(它一直停留在循环里),我得到的输出是:
/usr/lib/python2.7/dist-packages/numpy/core/_methods.py:96: RuntimeWarning: invalid value encountered in double_scalars
ret = ret / float(rcount)
c.backend: None
AsyncResult(c.id).ready(): False
AsyncResult(c.id).state: PENDING
AsyncResult(c.id).result: None
到这个时候,我不得不按两次CTRL+C。
我在阅读Celery 3.0 文档 - 单元测试时,里面告诉我需要设置。
CELERY_ALWAYS_EAGER = True
TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'
这个设置在celery 3.1.11中还有效吗?我找不到关于Django单元测试的Celery 3.1的相关文档,我不确定这些设置是有帮助还是有害,因为当我设置这些时,任务的后端返回的是空,但计算似乎确实在执行。
当我从设置文件中删除这两行时,我得到了这些结果:
c.backend: <celery.backends.amqp.AMQPBackend object at 0x7a4de50>
AsyncResult(c.id).ready(): False
AsyncResult(c.id).state: PENDING
AsyncResult(c.id).result: None
AsyncResult(c.id).ready(): True
AsyncResult(c.id).state: FAILURE
AsyncResult(c.id).result: task args must be a list or tuple
======================================================================
FAIL: test_calculations (measuring.tests.TestCalculations)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/var/www/project/calculationApp/tests.py", line 70, in test_calculations
self.assertEqual(int(number.attribute), 2212)
AssertionError: 0 != 2212
----------------------------------------------------------------------
Ran 1 test in 2.765s
1 个回答
2
你是想测试实际的计算逻辑,还是想确认Celery这个工具能正常工作?这两者是完全不同的事情。在我看来,你应该努力去单独测试你的逻辑。这样做更快,也更能适应未来的变化(比如你可能决定用其他工具替代Celery),而且会让事情变得简单很多。
如果你坚持要一起测试这两者,只需在单元测试的环境中把CELERY_ALWAYS_EAGER设置为True,这样就能解决你的问题。
其实你不需要测试Celery本身,它是可以正常工作的,而且它有自己的测试套件来证明这一点。