Testumgebung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich habe ein kleines Skript geschrieben, das unter anderem ein configfile im home-Ordner verwendet. Neben der Version, die ich täglich verwende, habe ich ein virtualenv Verzeichnis angelegt, innerhalb dessen ich das Skript via einer ``setup.py`` zum Testen installiert habe. Allerdings greift ja auch innerhalb von virtualenv das Skript auf meinen tatsächlichen home-Ordner zu. Wie kann ich das verhindern? Zum Testen eine Weiche ins Skript einbauen? Oder kann ich das via einer virtualenv-Einstellung umleiten?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

mutetella hat geschrieben:Allerdings greift ja auch innerhalb von virtualenv das Skript auf meinen tatsächlichen home-Ordner zu. Wie kann ich das verhindern?
Da ich mich mit virtualenv nicht auskenne, kann ich Dir nur einen konventionellen Tipp geben: Wende das Strategie-Muster an! Offenbar bist Du in einer Situation, in der der Ort der Daten oder sogar die Daten selber relevant sind. An der Stelle musst Du ansetzen:

Mache den Mechanismus derartig flexibel, dass Du die Datei z.B. als Parameter übergeben kannst. Nun musst Du an der aufrufenden Stelle natürlich noch wissen, welcher Pfad denn nun gewählt werden soll. Das könntest Du z.B. über einen Kommandozeilenparameter beim Start hinterlegen. Du könntest bei einem optionalen Parameter ja einen default Pfad angeben, so dass man im späteren Betrieb auf den Parameter verzichten kann und diesen nur in der Testumgebung angeben muss.

Evtl. ist es aber sogar noch eleganter, die Daten, die Du bisher nur aus der Config-Datei beziehst, so zu abstrahieren, dass sie auch aus anderer Quelle stammen können. An der Stelle, an der die Daten beschafft werden, muss nun abhängig von einem Parameter entschieden werden, ob diese aus der Config-Datei geladen oder als "Fake"-Daten irgend wo aus dem Quellcode stammen. In Python könnte man dafür sogar ein Modul schreiben, welches nur dann importiert wird, wenn man den Test-Weg beschreitet. Die Info über die Entscheidung muss natürlich auch bei dieser Variante irgend wie ins Programm kommen, evtl. also auch über einen booleschen Schalter bei Programmstart.

Dieser Ansatz hat den Charme und Vorteil gegenüber der ersten Variante, dass Du die aufrufende Stelle mittels Unittest testen kannst; das geht bei der anderen Variante naturgemäß nicht, da Du dort *immer* auf das Dateisystem zugreifst.

(Und: Der Link oben dient nur der Vollständigkeit; imho ist der Strategy-Pattern in Python oft extrem trivial zu implementieren; da braucht es keine wilden Klassen basierten Auswüchse, eben weil Python Funktionen höherer Ordnung hat, oder auch Lambdas oder allgemein "Callables". Aber auch ein simple ``if... else``-Weiche geht imho genau in die Richtung, sofern es um die "Datenbeschaffung" geht und man unabhängig des Weges danach auf derselben Datenstruktur arbeitet.)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

mutetella hat geschrieben:Allerdings greift ja auch innerhalb von virtualenv das Skript auf meinen tatsächlichen home-Ordner zu. Wie kann ich das verhindern?
Du könntest die Strategie anwenden, dass die Konfigurationsdatei sukzessive an verschiedenen Stellen gesucht wird, bis das Skript fündig wurde. In Deinem Fall: Suche im aktuellen Ordner, in dem das Skript gestartet wurde. Falls dies fehlschlägt, suche im Home-Verzeichnis. Dann kannst Du in deinem virtualenv (dort wo sich das Skript befindet) eine config-Datei anlegen und die wird dann statt der im Home-Verzeichnis verwendet.
Antworten