2009-01-21 4 views
28

Ich habe Unit-Tests nicht vor einer schnellen Einführung in einen Uni-Kurs verwendet. Ich schreibe gerade eine Anwendung und möchte mich TDD dabei beibringen. Das Problem ist, ich habe keine Ahnung, was ich testen soll oder wie.Schreibgeräte-Tests in Django/Python

Ich schreibe eine Django-Anwendung und habe bisher nur die Modelle erstellt (und die Admin-Anwendung angepasst). Dies ist, wie ich die Skelette von meinen Tests geschrieben habe, so weit:

class ModelTests(TestCase): 
    fixtures = ['initial_data.json',] 

    def setUp(self): 
     pass 

    def testSSA(self): 
     ssa = SSA.objects.create(name="sdfsdf", cost_center=1111, street_num=8, 
       street_name="dfsdfsf Street", suburb="sdfsdfsdf", 
       post_code=3333) 


    def testResident(self): 
     pass 

    def testSSA_Client(self): 
     pass 

ich eine Funktion zu testen jedes Modell innerhalb der ModelTests Klasse schreiben geplant. Ist das eine gute Möglichkeit, Tests zu schreiben? Auch was genau sollte ich testen? Das Erstellen eines Modells mit allen abgeschlossenen Feldern funktioniert? Dass ein halb vollständiges Modell versagt? Dass irgendwelche Spezialfälle getestet werden (wie eine Null und is_required = False)? Ich habe Vertrauen in das ORM, das, soweit ich weiß, stark getestet ist, also sollte ich nicht alle Methoden testen müssen, sollte ich?

Was muss ich für eine in Django/Python geschriebene Webanwendung testen? Einige Beispiele wären nett.

+0

Darf ich schamlos mein Tutorial zum Testen von Django-Apps, die nicht nur Komponententests, sondern auch ordnungsgemäße Browserverhalten testen mit dem mächtigen Selenium: [Test-Driven Django Tutorial] (http: // Harry .pythonanywhere.com /) – hwjp

Antwort

36

Ist eine Funktion zum Testen jedes Modells in der ModelTests-Klasse eine gute Möglichkeit, Tests zu schreiben?

Nr

Was genau soll ich testen?

  • Das Erstellen eines Modells mit allen Feldern abgeschlossen funktioniert?

  • Dass ein halb vollständiges Modell versagt?

  • Dass spezielle Fälle getestet werden (wie eine Null und is_required = False)?

  • Ich habe Vertrauen in das ORM, was soweit ich weiß ist stark getestet, so dass ich nicht alle Methoden testen sollte, sollte ich?

Nicht viel davon.

Sie könnten Validierungsregeln testen, aber das ist nicht sinnvoll, bis Sie einige Form-Objekte definiert haben. Dann haben Sie etwas zu testen - erzwingt das Formular alle Regeln. Sie benötigen mindestens eine TestCase-Klasse für jedes Formular. Eine Funktion ist ein Szenario - verschiedene Kombinationen von Eingaben, die erlaubt oder nicht erlaubt sind.

Für jede Model-Klasse benötigen Sie mindestens eine TestCase-Klassendefinition. Testfälle sind billig, definieren viele davon.

Ihr Modell verkörpert Ihre Definitionen für "Geschäftseinheiten". Ihre Modelle verfügen über Methoden zum Implementieren von Geschäftsregeln. Ihre Methoden werden Dinge zusammenfassen, filtern, berechnen, zusammenfassen, reduzieren, alle möglichen Dinge. Sie haben Funktionen für jedes dieser Features einer Modellklasse.

Sie testen Django nicht. Sie testen, wie Ihre Geschäftsregeln in Django funktionieren.

Später, wenn Sie mehr Sachen in Ihrer Anwendung haben (Formulare, Ansichten, URLs, etc.), sollten Sie den Django Unittest Client verwenden, um jede Methode für jede URL auszuprobieren. Noch einmal, ein Testfall pro

+2

Nachdem ich die Skelette geschrieben und zwei Tests für ein Modell definiert hatte, war mir klar geworden, dass ich meine Zeit verschwenden würde. Es gab nichts zu testen, über das ich nicht sicher war. Ich habe jedoch noch keine benutzerdefinierten Methoden definiert. Sehr gute Antwort, ich weiß es zu schätzen. –

+2

@Josh Smeaton: keine Zeit verschwenden. Diese vereinfachten Skelett-Tests sind auf lange Sicht hilfreich. In der Zukunft werden Sie ein Refactoring durchführen, das trivial erscheint und einer dieser lahmen Tests bricht, was darauf hindeutet, dass Sie etwas übersehen haben. "Sicher" ist nicht immer gut genug. Sie brauchen einen "Beweis". –

+0

Warten Sie, also sagen Sie, dass Komponententests wie "test_create_User" und "test_delete_User", im Grunde Unit-Test ein DAO (Datenzugriffsobjekt) ist kein würdiger Komponententest? Stattdessen sollten wir die Service-Schicht oder Klassen testen, die DAOs aufrufen. Ich dachte, dass ich einen banalen Komponententest schreiben müsste, um zu testen, dass ja, wenn ich versuche, einen Benutzer zu erstellen, der bereits existiert, sollte ich den vorhandenen Benutzer zurückgeben und nicht versuchen, einen doppelten Benutzer zu erstellen usw. Und wenn ich einen nicht lösche -existenter User, dann sollte ich einen LookupError auslösen, etc. – user798719

9

Ich bin mir nicht ganz sicher, was genau Sie hier testen wollen, ich brauche mehr Code-Schnipsel dafür, aber ich kann Ihnen einen allgemeinen Rat geben.

Zuerst lesen Sie das Unit Testing Kapitel von "Tauchen in Python" (es ist kostenlos online! http://diveintopython3.ep.io/unit-testing.html), es ist eine großartige Erklärung der Unit-Tests im Allgemeinen, was Sie tun müssen, und warum.

Zweitens, in Bezug auf TDD, ist es eine wertvolle Übung, aber vorsichtig sein zu wachsen zu abhängig davon, wie ich festgestellt habe, kann dazu führen, zu überspezifizierende Software und weiter zu haben Software, die nicht re sein kann -entwickelt und an neue Aufgaben angepasst. Das ist nur meine Erfahrung. Auch, wenn Sie es nicht dogmatisch verwenden, ist TDD wertvoll.

Drittens scheint es mir, dass der beste Ratschlag für Ihre spezifische Situation ist zu bemüht, Ihre Logik zu testen, aber nicht die Logik des Frameworks, die Sie auf abhängen. Das bedeutet, dass das Testen halbfertiger Modelle oft fehlschlägt, etc. etc. möglicherweise nicht angemessen ist, da das nicht Ihre Logik ist, sondern Djangos, und so sollten Sie bereits getestet werden. Wertvoller wäre es, einige wenige erwartete Fälle, von Ihnen erwartete Instanziierungen, erwartete Ausnahmen usw. zu testen, um sicherzustellen, dass Ihre Modellspezifikation fehlerfrei ist, und dann zur umfangreicheren Logik Ihrer Anwendung überzugehen.

+1

+1 für die Zusammenfassung, wie man tatsächlich mit Komponententests in Python beginnt und eigene Erfahrungen mit TDD teilt. –

4

Vermutlich haben Sie bereits Tests Django Applications gelesen.

Beginnen Sie mit dem Testen der normalen Anwendungsfälle Ihrer Anwendung, erstellen Sie einen neuen Benutzer, fügen Sie einen Blogeintrag usw. hinzu. Gehen Sie zuerst in Ihre typischen CRUD-Operationen und dann in die Edge-Fälle. Grundsätzlich wird das Vertrauen in Ihre Anwendung, dass alles, was Sie später ändern, das Verhalten der Anwendung nicht beeinträchtigen.

Simulieren Sie GET/POST-Anfragen in Ihren URLs und beobachten Sie die Antworten (Header, Statuscodes und Inhalt). Hat Ihre Anwendung die richtige Ansicht gerendert? Verwenden Sie die richtige Vorlage? Versuchen Sie in den Abschnitten, in denen Ihre Anwendung Ausnahmen auslöst, diese auszulösen (z. B. Anzeigen/Bearbeiten eines nicht vorhandenen Datensatzes, um ObjectDoesNotExist auszulösen).

Es lohnt sich, ein Tracking-System (z. B. Trac) einzubauen, damit Sie für jeden protokollierten Fehler einen neuen Test hinzufügen können.