Caching-Ergebnis von setUp () mit Python-Unittest

8

Ich habe derzeit einen unittest.TestCase, der aussieht wie ..

%Vor%

Das funktioniert gut, aber der Aufruf von Trailers() dauert etwa 2 Sekunden. Da setUp() aufgerufen wird, bevor jeder Test ausgeführt wird, dauern die Tests jetzt fast 10 Sekunden (mit nur 3 Testfunktionen)

Wie wird die Variable self.all_trailers zwischen Tests korrekt zwischengespeichert?

Entfernen Sie die Setup-Funktion und machen Sie ..

%Vor%

.. funktioniert, aber dann behauptet es "lief 3 Tests in 0.000s" was falsch ist. Die einzige andere Möglichkeit, die mir einfällt, ist die globale Variable cache_trailers (die zwar richtig funktioniert, aber ziemlich schrecklich ist):

%Vor%     
dbr 31.12.2008, 07:43
quelle

5 Antworten

14

Wie wäre es mit einem Klassenmitglied, das nur einmal initialisiert wird?

%Vor%

Lookups, die sich auf self.all_trailers beziehen, gehen zum nächsten Schritt im MRO - self.__class__.all_trailers , die initialisiert werden.

    
cdleary 31.12.2008, 07:48
quelle
8

Eine Alternative zu der vorgeschlagenen Lösung wäre die Verwendung eines besser ausgestatteten Testlaufers wie Nase . Mit Nase können Sie Setup-Funktionen auf Modulebene haben, die einmal für ein Testmodul ausgeführt werden. Da es vollständig kompatibel mit Unittest ist, müssten Sie keinen Code ändern.

Aus dem Handbuch zur Nase:

  

Nase unterstützt Leuchten an der Verpackung,   Modul-, Klassen- und Testfallebene so    teure Initialisierung kann durchgeführt werden    so selten wie möglich .

Fixtures sind hier im Detail beschrieben . Neben der Erfüllung Ihres Anwendungsfalles kann ich es natürlich auch als allgemeines Testwerkzeug empfehlen. Keines meiner Projekte wird ohne es verlassen.

    
Ali Afshar 31.12.2008 17:25
quelle
5

Wenn Sie Python & gt; = 2.7 verwenden, können Sie die setUpClass Methode, die nur einmal für den gesamten Komponententest aufgerufen wird.

%Vor%     
chiborg 04.04.2011 14:16
quelle
1

Was macht die Klasse Trailers?
Wenn es einen Zustand enthält, müssen Sie setzen, um jedes Mal, wenn der Unit-Test ausgeführt wird, zurückzusetzen.

Um Ihr Problem zu lösen, würde ich ein Mock-Objekt verwenden - indem ich nur die Schnittstelle von Trailers nachbilde, die gefälschte Daten liefert.

Aktualisieren : Da Trailers nur XML-Daten liest, würde ich nach einer Lösung wie der von cdleary vorgeschlagenen suchen.

    
Roberto Liffredo 31.12.2008 07:49
quelle
0

Es ist erwähnenswert, dass der in der Zope / Plone-Welt verwendete Testrunner im Jahr 2010 als separates Modul veröffentlicht wurde, was nicht überraschend zope heißt .Testrunner . Es unterstützt Caching setUps in Form von "Layers". Schau es dir an.

    
Lennart Regebro 02.01.2011 11:47
quelle

Tags und Links