Wie kann ich Änderungen beibehalten, die in ein und demselben Objekt erben, die nur in TestCase
geerbt wurden?
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
foo = 'bar'
def setUp(self):
pass
def test_a(self):
self.assertEqual(self.foo, 'bar')
self.foo = 'can'
def test_f(self):
self.assertEqual(self.foo, 'can')
if __== '__main__':
unittest_main()
Ich möchte, dass diese beiden Tests bestanden werden
Wie einige Kommentare widerhallten, ist die Strukturierung Ihrer Tests auf diese Weise wahrscheinlich ein Konstruktionsfehler in den Tests selbst, und Sie sollten eine Neustrukturierung der Tests in Betracht ziehen. Wenn Sie dies jedoch möchten und sich darauf verlassen, dass der von Ihnen verwendete Testläufer sie in alphabetischer Reihenfolge (scheinbar) ausführt, dann empfehle ich Folgendes.
Ähnlich wie bei @Matthias, aber ich würde eine Sache anders machen, wenn Sie sich zu einem späteren Zeitpunkt von der Klasse erben möchten.
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
foo = 'bar'
def setUp(self):
pass
def test_a(self):
self.assertEqual(self.__class__.foo, 'bar')
self.__class__.foo = 'can'
def test_f(self):
self.assertEqual(self.__class__.foo, 'can')
if __== '__main__':
unittest_main()
Der Unterschied zwischen dieser Antwort und der von Ihnen akzeptierten Antwort von @ Matthias ist die explizite Deklaration der Klasse im Vergleich zum Nachschlagen der Klassenreferenz.
TestSimpleFoo vs self.__class__
Ich bevorzuge die Dynamik, so dass ich die Tests später erben kann und beide Testklassen nacheinander ausführen kann, ohne dass es zu einem Crossover zwischen den beiden kommt. Wenn Sie sich entscheiden würden, von dieser Klasse zu erben, würde das explizite Benennen der Klassenreferenz dazu führen, dass beide Testklassen für diese Referenz statt für ihre eigenen Klassen ausgeführt werden.
Ich mag Ihre eigene Antwort für die Einfachheit, aber wenn Sie unterschiedliche Unit-Tests beibehalten möchten:
Anscheinend führt unittest separate Tests mit neuen Instanzen des Testfalls durch. Nun, binden Sie die zu beharrenden Objekte einfach an etwas anderes als sich selbst. Zum Beispiel:
from unittest import TestCase, main as unittest_main
class TestSimpleFoo(TestCase):
def setUp(self):
pass
def test_a(self):
TestSimpleFoo.foo = 'can'
def test_f(self):
self.assertEqual(TestSimpleFoo.foo, 'can')
if __== '__main__':
unittest_main()
Möglicherweise interessieren Sie sich auch für setUpClass und tearDownClass: https://docs.python.org/3/library/unittest.html#setupclass-and-teardownclass
Achten Sie auch auf die Ausführungsreihenfolge Ihrer Komponententests: https://docs.python.org/2/library/unittest.html#unittest.TestLoader.sortTestMethodsUser
Konnte es nicht verstehen; Am Ende hackte es mit mehreren nicht-test_
-vorangestellten Funktionen:
def test_password_credentials_grant(self):
for user in self.user_mocks:
self.register(user)
self.login(user)
self.access_token(user, self.assertEqual) # Ensures access_token is generated+valid
self.logout(user)
self.access_token(user, self.assertNotEqual) # Ensures access_token is now invalid
self.unregister(user)
Abgesehen von dem, was andere sagten, sollte der Datenaustausch zwischen den Testmethoden nicht auf diese Weise implementiert werden. Verwenden Sie setup ().
Die Testmethode selbst sollte isoliert werden.