2014-02-28 14 views
5

Ich schreibe eine wiederverwendbare Django-App. Es ist keine gewöhnliche App, die alleine benutzt werden kann. Es erfordert, dass andere Apps wie django.contrib.admin oder django-dajaxice verwendet werden können.Funktionelle Tests in wiederverwendbaren Django-Apps

Mein aktuelles Projekt Baum sieht wie folgt aus:

django-myapp/ 
    docs/ 
     some.rst 
     docs.rst 
     ... 
    myapp/ 
     static/ 
      myapp/ 
       some_js_stuff.js 
     templatetags/ 
      some_file.py 
     __init__.py 
     base.py 
     manager.py 
     ... 
    unit_tests/ 
     __init__.py 
     test_base.py 
     test_manager.py 
    functional_tests/ 
     __init__.py 
     functional_tests.py 
     urls.py 
    README.rst 
    LICENSE 
    requirements.txt 
    requirements-test.txt 
    setup.py 
    ... 

Unit-Tests sind einfach - ich bin mein Code nur zu testen, so brauche ich nicht vollständig Django-Umgebung, um sie auszuführen. Einfache ./setup.py test funktioniert perfekt.

Funktionsprüfung ist der knifflige Teil. Ich möchte Selen verwenden, also brauche ich einen laufenden Dev-Server und das erfordert eine ganze Django-Umgebung. Ich versuche django.test.LiveServerTestCase zu verwenden, aber ohne Erfolg (Es sieht so aus, als wären keine URLs definiert, die Einstellung ROOT_URLCONF in settings und urls Attribut in der Klasse hat nicht geholfen).

Jede Dokumentation, die ich gefunden habe, jede Frage zu stackoverflow sagt über das Testen von Django-Apps im Django-Projekt. Und hier ist meine Frage: Was ist der beste (und funktionierende) Weg, Funktions-/Integrationstests von wiederverwendbaren Apps auszuführen, ohne ein komplettes Django-Projekt einzurichten?

+0

Ich nehme an, Sie haben eine lokale Entwicklungsversion, die gut funktioniert? 'LiveServerTestCase' erfordert im Wesentlichen eine funktionierende Entwicklungsumgebung, verwendet jedoch eine Testdatenbank und führt für jeden ausgeführten Test den Standard-Setup/-Teardown durch. Es ist schwierig, Funktionstests an etwas durchzuführen, das nicht funktioniert. –

Antwort

3

Als Nathan says ist es schwierig, eine Einheit in einem ganzen Stapel zu testen, ohne den Stapel. Sie müssen also eine Einstellungsdatei haben. Werfen Sie einen Blick darauf, wie die ausgezeichnete django-debug-toolbar App tut es:

Es hat eine Makefile mit einer test_selenium Regel:

test_selenium: 
    DJANGO_SELENIUM_TESTS=true DJANGO_SETTINGS_MODULE=tests.settings \ 
     django-admin.py test tests 

Und in seinem tests Modul hat ein bloßen Knochen settings.py mit dem Nötigsten:

  • INSTALLED_APPS mit der App im Test
  • ROOT_URLCONF was auf die urls.py
  • stuff wie MIDDLEWARE_CLASSES, dass Sie kann überspringen, weil Sie keine haben.

und ein test_integration.py

@skipUnless('DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested") 
class DebugToolbarLiveTestCase(LiveServerTestCase): 
    ... 

ihre Setup-Studie. Beginne beim Makefile und grabe nach, um zu verstehen, warum alles da ist.

Ich mag dieses Setup, weil Integration/funktionale Tests dazu neigen, dogslow zu sein. Verständlicherweise testen sie den ganzen Stapel mit all seinen beweglichen Teilen. Ihr Makefile bietet eine einfache Möglichkeit, sie zu überspringen. Wenn ich eine wiederverwendbare App hätte, die Javascript verwendet, würde ich mir auch ansehen. Oder etwas other tool, um das Javascript zu testen. Denn die langsamen Integrationstests auszuführen, nur um zu sehen, ob die js-Einheiten funktionieren, ist ein Schmerz.

+0

Danke @Chris. Dies ist genau das, was ich gesucht habe :) Ich weiß, dass ich minimale Initialisierung von Django-Stack brauche, aber ich wusste nicht, wie es richtig geht.Ich experimentierte mit einem benutzerdefinierten Test-Runner oder mit dem Einrichten eines Stacks in meinem Funktionstest-Modul, aber es hat nicht funktioniert. –

Verwandte Themen