在Celery 3.1.11中使用Django进行单元测试?

sku*_*kid 6 python django unit-testing celery

我正在使用带有Django 1.6的Celery 3.1.11.我一直在寻找,但我最近没有找到很多关于芹菜的问题.(3.1)

我试图通过manage.py运行单元测试:

>> python manage.py test calculationApp
Run Code Online (Sandbox Code Playgroud)

在我的tests.py for calculationApp中创建任务:

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()
Run Code Online (Sandbox Code Playgroud)

当我运行单元测试时,测试卡在测试中并且从未准备好(它永远不会超过while循环),我将其作为输出:

/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
Run Code Online (Sandbox Code Playgroud)

此时我必须按CTRL + C两次.

我正在阅读Celery 3.0 Docs - Unit Testing,它告诉我要设置.

CELERY_ALWAYS_EAGER = True
TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner'
Run Code Online (Sandbox Code Playgroud)

这对芹菜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
Run Code Online (Sandbox Code Playgroud)

小智 2

你是想测试实际的计算逻辑还是 Celery 的工作原理?这是两件不同的事情,在我看来,你应该非常努力地单独测试你的逻辑。它更快、更面向未来(如果你决定用其他东西代替 Celery 会怎么样)并且简化了很多事情。如果您坚持同时测试两者,只需在单元测试上下文中将 CELERY_ALWAYS_EAGER 设置为 True 就可以解决您的问题。

您不需要测试 Celery,它可以工作,并且有自己的测试套件来证明它。