Ich kämpfe wirklich darum, effektive Komponententests für ein großes Django-Projekt zu schreiben. Ich habe eine einigermaßen gute Testabdeckung, habe jedoch festgestellt, dass es sich bei den von mir erstellten Tests definitiv um Integrations- / Akzeptanztests handelt, überhaupt nicht um Komponententests, und ich habe kritische Teile meiner Anwendung, die nicht effektiv getestet werden. Ich möchte dieses Problem so schnell wie möglich beheben.
Hier ist mein Problem. Mein Schema ist zutiefst relational und stark zeitorientiert, was meinem Modellobjekt eine hohe interne Kopplung und viel Zustand verleiht. Viele meiner Modellmethoden fragen basierend auf Zeitintervallen ab, und ich habe viel mit auto_now_add
Zeitstempeln zu tun. Nehmen Sie also eine Methode, die zum Beispiel so aussieht:
def summary(self, startTime=None, endTime=None):
# ... logic to assign a proper start and end time
# if none was provided, probably using datetime.now()
objects = self.related_model_set.manager_method.filter(...)
return sum(object.key_method(startTime, endTime) for object in objects)
Wie geht man vor, um so etwas zu testen?
Hier bin ich soweit. Es fällt mir ein, dass das Unit-Test-Ziel ein falsches Verhalten by key_method
in Bezug auf seine Argumente zeigen sollte. summary
Wird richtig gefiltert / aggregiert, um ein korrektes Ergebnis zu erzielen?
Datetime.now () zu verspotten ist einfach genug, aber wie kann ich den Rest des Verhaltens verspotten?
- Ich könnte Fixtures verwenden, aber ich habe Vor- und Nachteile der Verwendung von Fixtures zum Erstellen meiner Daten gehört (schlechte Wartbarkeit ist für mich ein Nachteil).
- Ich könnte meine Daten auch über den ORM einrichten, aber das kann einschränkend sein, da ich dann auch verwandte Objekte erstellen muss. Und mit dem ORM können Sie nicht
auto_now_add
manuell mit Feldern herumspielen. - Das Verspotten des ORM ist eine weitere Option, aber es ist nicht nur schwierig, tief verschachtelte ORM-Methoden zu verspotten, sondern die Logik im ORM-Code wird aus dem Test herausverspottet, und das Verspotten scheint den Test wirklich von den Interna und Abhängigkeiten des zu abhängig zu machen zu prüfende Funktion.
Die am schwierigsten zu knackenden Nüsse scheinen Funktionen wie diese zu sein, die auf einigen Schichten von Modellen und Funktionen auf niedrigerer Ebene basieren und sehr zeitabhängig sind, auch wenn diese Funktionen möglicherweise nicht sehr kompliziert sind. Mein generelles Problem ist, dass meine Tests, egal wie ich sie aufschlitze, viel komplexer aussehen als die Funktionen, die sie testen.