2014-06-13 26 views
6

Ich benutze Sellerie 3.1.11 mit Django 1.6. Ich habe gesucht, aber ich bin nicht in der Lage, eine Menge Fragen aus der jüngsten Vergangenheit über Sellerie zu finden (3,1)Unit Testing mit Django in Sellerie 3.1.11?

I Unit-Tests durch manage.py zu laufen bin versucht.

>> python manage.py test calculationApp 

in meinem tests.py für calculationApp erstelle ich die Aufgabe:

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() 

Wenn ich das Gerät Test ausführen, der Test im Test stecken bleibt und ist nie fertig (es wird nie vorbei an der while-Schleife), erhalte ich diese als Ausgabe:

/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 

An diesem Punkt muss ich zweimal STRG + C drücken.

Ich las Celery 3.0 Docs - Unit Testing, die mir gesagt, zu setzen.

CELERY_ALWAYS_EAGER = True 
TEST_RUNNER = 'djcelery.contrib.test_runner.CeleryTestSuiteRunner' 

Ist dies immer noch für Sellerie 3.1.11 gültig? Ich kann keine relevante Dokumentation für Sellery 3.1 über Django-Komponententests finden, und ich bin nicht sicher, ob diese Einstellungen hilfreich oder schädlich sind, da das Backend für die Aufgabe keine zurückgibt, wenn ich diese setze, aber die Berechnungen scheinen tatsächlich ausgeführt zu werden .

Wenn ich diese beiden Zeilen entfernen Sie die Einstellungsdatei ich diese Ergebnisse erhalten:

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 

Antwort

2

Versuchen Sie, die tatsächliche Berechnungslogik oder die Tatsache zu testen, dass Sellerie funktioniert? Das sind zwei verschiedene Dinge, und meiner Meinung nach sollten Sie wirklich versuchen, Ihre Logik isoliert zu testen. Es ist schneller, zukunftssicherer (was ist, wenn Sie sich entscheiden, Sellerie durch etwas anderes zu ersetzen) und vereinfacht die Dinge viel. Wenn Sie darauf bestehen, beide Tests gemeinsam zu testen, sollten Sie Ihr Problem nur lösen, indem Sie CELERY_ALWAYS_EAGER nur im Komponententestkontext auf "True" setzen.

Sie müssen Sellerie nicht testen, es funktioniert und es hat seine eigene Testsuite, um es zu beweisen.

+0

Ich habe gerade versucht, meine Komponententests für meine Anwendung auszuführen, nicht testen, ob Sellerie funktioniert. Ich habe einfach verschiedene Werte ausgedruckt, um zu verstehen, was in Sellerie vor sich ging. – skullkid