* Tests können in Klassen zusammengefasst werden * müssen Test heißen * Testmethoden heißen test_ * diese haben kein __init__ * Gemeinsame Variablen können nur als Klassenvariablen deklariert werden * jeder ausgührte Test hat eine eigene Instanz der Klasse * das setzen von Variablen in einem Test beeinflusst also nicht die Ausführung in einem anderen Test ====== Mocking ====== ===== Wo gemocked werden muss ===== * Muss an der Stelle durchgeführt werden wo das Objekt aus Sicht des zu testenden Objektes im Namensraum auftaucht # in mymodule import somemodule somemodule.a() * Um a zu mocken muss somemodule.a gemockt werden * in diesem Fall fallen Definitionsort und der Namensraum zusammen Wenn hingegen # in mymodule from somemodule import a a() * muss mymodule.a gemockt werden * der Namensraum an den a() gebunden ist ist mymodule * a() ist an sich aber (original) in somemodule definiert ===== ====== Begriffe ====== * Gute Erklärung: https://alpopkes.com/posts/python/mocking/ ===== Fixture ===== * Im Prinzip die Testumgebung bzw. jedes Teil davon * im Sinne von Fix -> Fest, eine feste/gegebene Umgebung in der der Test läuft * darunter fallen Funktionen/Methoden, Resourcen (Datenbanken, Netzwerkverbindungen usw.) die eben diesen Zustand zur Verfügung stellen/darstellen * auch Mocks von Funktionsaufrufen und API-Calls ===== Mock - generell ===== Funktionen (im Sinne von Objekten, Methoden und Funktionen) rufen häufig andere Funktionen, Variablen/Konstanten oder Attribute von Klassen ab um ihre Arbeit zu tun.\\ Das ist eine zusätzliche Quelle von Fehlern (da eben diese sich bereits falsch verhalten können) und ggf. "kostenintensiv" (im Sinne von Rechenleistung und RAM oder Ausführungszeit oder aufwendiger Aufbau nötig). \\ Um diesen Aufwand zu sparen benutzt man Mocks, im Prinzip Simulationen oder Kartonage-Abbilder die nur die relevanten Werte zurückgeben ohne wirklich irgendwelchen Code auszuführen. * Funktionen geben einen definierten Rückgabewert zurück * Klassen Attribute haben feste Werte ===== Dummies ===== Objekte (was letztendlich auch primitive Datentypen inkludiert) die übergeben werden müssen, aber keinen Einfluss auf das zu testende Objekt haben. \\ Zum Beispiel Parameter die zum instanzieren einer Klassen nötig sind, aber das Objekt was getestet wird ist eine Funktion der Klasse, die durch eben jenenen Parameter nicht beeinflusst wird/nicht davon abhängt. \\ Die Klasse ließe sich nur ohne den Parameter nicht instanzieren. ===== Fake ===== Implementiert eine Methode oder Klasse die wirklich funktioniert (also wirklich etwas tut), das aber in der Regel auf eine verkürzte Weise tut wie das Original ===== Stubs ===== Gibt hart kodierte Rückgabewerte zurück. ===== Mocks ===== Zeichnen zusätzlich zu Stubs auf was die Aufruparameter waren. ===== Spies ===== Wrapper um das Originalobjekt welches aufgerufen werden soll. Zeichnet nur die Parameter auf mit denen das Objekt aufgerufen wurde.