unittest Schreibeinheitstests in Django/Python




python django unittest (3)

Ich habe Unit-Tests nicht vor einer kurzen 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.

Ich schreibe eine Django-Anwendung und habe bisher nur die Modelle erstellt (und die Admin-Anwendung angepasst). So habe ich die Skelette meiner bisherigen Tests geschrieben:

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 plante, eine Funktion zu schreiben, um jedes Modell innerhalb der ModelTests-Klasse zu testen. 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.


Ich bin mir nicht ganz sicher, was genau Sie hier testen wollen. Ich würde dafür mehr Codeschnipsel benötigen, aber ich kann Ihnen einen allgemeinen Rat geben.

Lesen Sie zuerst das Unit-Test-Kapitel von "Dive in Python" (es ist kostenlos online! Http://diveintopython3.ep.io/unit-testing.html ), es ist eine großartige Erklärung für Unit-Tests im Allgemeinen, was Sie tun müssen , und warum.

Zweitens, in Bezug auf TDD, ist es eine wertvolle Übung, aber seien Sie vorsichtig, wenn Sie zu abhängig davon werden, da ich festgestellt habe, dass es zu überspezifizierender Software und weiter zu Software führen kann, die nicht neu entwickelt und angepasst werden kann zu neuen Aufgaben. Das ist nur meine Erfahrung. Auch, wenn Sie es nicht dogmatisch verwenden, ist TDD wertvoll.

Drittens fällt mir auf, dass der beste Ratschlag für Ihre spezifische Situation darin besteht, Ihre Logik zu testen, aber nicht die Logik der Rahmenbedingungen, auf die Sie angewiesen sind . 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.


Vermutlich hast du bereits Testing 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. Fahren Sie zunächst mit Ihren typischen CRUD-Operationen fort und gehen Sie dann zu den Edge-Fällen. 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 für Ihre URLs und beobachten Sie die Antworten (Kopfzeilen, Statuscodes und Inhalte). 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).

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


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

Nein.

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?

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 "Geschäftseinheit" -Definitionen. 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.

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

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





unit-testing