it-swarm.com.de

Variabler Wechsel zwischen den Tests persistent bleiben?

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

30
A T

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. 

40
rdp

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

9
Matthias

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)
1
A T

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. 

0
Gearon