Meine Python-Version ist 2.6.
Ich möchte die Test-SetUp-Methode nur einmal ausführen, da ich dort Dinge mache, die für alle Tests benötigt werden.
Meine Idee war es, eine boolesche Variable zu erstellen, die nach der ersten Ausführung auf 'true' gesetzt wird und dann mehr als einen Aufruf der Setup-Methode deaktiviert.
class mySelTest(unittest.TestCase):
setup_done = False
def setUp(self):
print str(self.setup_done)
if self.setup_done:
return
self.setup_done = True
print str(self.setup_done)
Die Ausgabe:
False
True
--- Test 1 ---
False
True
--- Test 2 ---
Warum funktioniert das nicht? Habe ich etwas vergessen?
python
unit-testing
Kesandal
quelle
quelle
setUp
.Antworten:
Sie können
setUpClass
Methoden definieren, die nur einmal pro Testsuite ausgeführt werden.quelle
Daniels Antwort ist richtig, aber hier ist ein Beispiel einige häufige Fehler zu vermeiden , fand ich, wie nicht Aufruf
super()
in ,setUpClass()
wennTestCase
eine Unterklasse vonunittest.TestCase
(wie indjango.test
oderfalcon.testing
).In der Dokumentation für
setUpClass()
wird nicht erwähnt, dass Siesuper()
in solchen Fällen anrufen müssen . Andernfalls wird eine Fehlermeldung angezeigt, wie in dieser verwandten Frage dargestellt .class SomeTest(TestCase): def setUp(self): self.user1 = UserProfile.objects.create_user(resource=SomeTest.the_resource) @classmethod def setUpClass(cls): """ get_some_resource() is slow, to avoid calling it for each test use setUpClass() and store the result as class variable """ super(SomeTest, cls).setUpClass() cls.the_resource = get_some_resource()
quelle
TestCase
es sich um eine Unterklasse von handeltunittest.TestCase
.Wenn Sie hier gelandet sind, weil Sie einige Daten zum Testen laden müssen ... Wenn Sie Django 1.9+ verwenden, wählen Sie bitte setUpTestData :
class MyTests(TestCase): @classmethod def setUpTestData(cls): # Set up data for the whole TestCase cls.foo = Foo.objects.create(bar="Test") def test1(self): self.assertEqual(self.foo.bar, 'Test')
quelle
Versuchen Sie nicht, die Aufrufe von setUp zu deduplizieren, sondern rufen Sie es einfach einmal auf.
Zum Beispiel:
class MyClass(object): ... def _set_up(): code to do one-time setup _set_up()
Dies ruft _set_up () auf, wenn das Modul zum ersten Mal geladen wird. Ich habe es als Funktion auf Modulebene definiert, aber Sie können es auch zu einer Klassenmethode von MyClass machen.
quelle
Platzieren Sie den gesamten Code, den Sie einrichten möchten, einmal außerhalb von mySelTest.
setup_done = False class mySelTest(unittest.TestCase): def setUp(self): print str(setup_done) if setup_done: return setup_done = True print str(setup_done)
Eine andere Möglichkeit besteht darin, eine Singleton-Klasse zu haben, in der Sie instanziieren
setUp()
, die den__new__
Code nur einmal ausführt und die Objektinstanz für den Rest der Aufrufe zurückgibt. Siehe: Gibt es eine einfache, elegante Möglichkeit, Singletons zu definieren?class Singleton(object): _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singleton, cls).__new__( cls, *args, **kwargs) # PUT YOUR SETUP ONCE CODE HERE! cls.setUpBool = True return cls._instance class mySelTest(unittest.TestCase): def setUp(self): # The first call initializes singleton, ever additional call returns the instantiated reference. print(Singleton().setUpBool)
Dein Weg funktioniert aber auch.
quelle
setup_done ist eine Klassenvariable, keine Instanzvariable.
Sie verweisen auf eine Instanzvariable:
self.setup_done
Sie müssen es jedoch als Klassenvariable referenzieren:
mySelTest.setup_done
Hier ist der korrigierte Code:
class mySelTest(unittest.TestCase): setup_done = False def setUp(self): print str(mySelTest.setup_done) if mySelTest.setup_done: return mySelTest.setup_done = True print str(mySelTest.setup_done)
quelle
Ich verwende Python 3 und habe festgestellt, dass die
cls
Referenz auch in dersetup
Methode verfügbar ist. Daher funktioniert Folgendes:class TestThing(unittest.TestCase): @classmethod def setUpClass(cls): cls.thing = Thing() # the `thing` is only instantiated once def setup(self): self.thing = cls.thing # ...but set on each test case instance def test_the_thing(self): self.assertTrue(self.thing is not None)
quelle