2012-05-13 17 views
6

Ich möchte eine self.attr einer unittest.TestCase Klasse verwenden, aber es scheint es zwischen den Tests nicht persistent ist:self.attr zwischen den Tests in unittest.TestCase setzt

import unittest 

class TestNightlife(unittest.TestCase): 
    _my_param = 0 

    def test_a(self): 
     print 'test A = %d' % self._my_param 
     self._my_param = 1 

    def test_b(self): 
     print 'test B = %d' % self._my_param 
     self._my_param = 2 

if __name__ == "__main__": 
    unittest.main() 

Dies ergibt die folgende Ausgabe:

Ändert die Instanz unittest.TestCase zwischen Testläufen? Warum?

+0

** Motivation: ** Natürlich können Sie nicht Prüfauftrag, aber manchmal ein bestimmte Test verändert etwas in der Umwelt übernehmen und ein weiterer Test wissen sollte, wenn es bereits geändert oder nicht, um bestimmte Aktionen zu ergreifen oder zu unterlassen. Manchmal ist es einfacher und lesbarer, diese Informationen in einer Variablen zu speichern, anstatt Hilfsfunktionen zu verwenden, die den Zustand des Berichts überprüfen. Selbst wenn Sie mit dieser Vorstellung nicht einverstanden sind, ist es immer noch interessant zu wissen, was zwischen den Tests mit sich selbst passiert. Die Frage ist also interessant. – Jonathan

Antwort

7

Das funktioniert so, weil unittest.main() ein separates Objekt für jeden Test erstellt (in diesem Fall werden zwei Objekte erstellt).

Über Ihre Motivation: Test sollte den globalen Zustand nicht ändern. Sie sollten den globalen Status in den Status vor dem Test in tearDown versetzen oder selbst testen. Es ist sehr problematisch, wenn Tests den globalen Zustand ändern, Sie werden in Szenarien geraten, die Sie früher oder später nicht vorhersagen können.

import unittest 

class TestNightlife(unittest.TestCase): 
    _my_param = 0 

    def test_a(self): 
     print 'object id: %d' % id(self) 
     print 'test A = %d' % self._my_param 
     self._my_param = 1 

    def test_b(self): 
     print 'object id: %d' % id(self) 
     print 'test B = %d' % self._my_param 
     self._my_param = 2 

if __name__ == "__main__": 
    unittest.main() 

Ausgang:

object id: 10969360 
test A = 0 
.object id: 10969424 
test B = 0 
. 
---------------------------------------------------------------------- 
Ran 2 tests in 0.000s 

OK 
+1

Ich stimme dem globalen Zustand vollkommen zu, trotzdem mache ich es, um die Tests und die Praktikabilität zu beschleunigen Beats purity ... ' – Jonathan

+0

BTW, haben Sie einen Hinweis darauf, dass unittest.main() ein separates Objekt pro Test erstellt? Wenn ja, fügen Sie es hinzu und ich werde die Frage als akzeptiert markieren – Jonathan

+0

Ich habe keinen Bezug auf Dokumentation, unittest funktioniert nur so (siehe Beispielcode). –

Verwandte Themen