web-dev-qa-db-fra.com

Persister les changements de variables entre les tests dans unittest?

Comment puis-je conserver les modifications apportées au sein du même objet héritant de TestCase en unittest?

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()

I.e .: Je veux que ces deux tests ci-dessus réussissent

30
A T

Comme certains commentaires l'ont répercuté, la structuration de vos tests de cette manière est probablement un défaut de conception des tests eux-mêmes et vous devez envisager de les restructurer. Cependant, si vous voulez faire cela et que vous vous appuyez sur le fait que le testeur que vous utilisez les exécute dans un ordre alphabétique (apparemment), je suggère ce qui suit.

Semblable à ce que @Mathias disait, mais je ferais une chose différente pour les cas où vous pourriez décider d'hériter de la classe à une date ultérieure.

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()

La différence entre cette réponse et celle de @ Matthias que vous avez acceptée est la déclaration explicite de la classe par rapport à la recherche de ladite référence de classe. 

TestSimpleFoo vs self.__class__

Je préfère la dynamique afin de pouvoir hériter des tests ultérieurement et d'exécuter les deux classes de test l'une après l'autre sans qu'il y ait de croisement entre les deux. En effet, si vous choisissez d'hériter de cette classe, nommer explicitement la référence de la classe entraînerait l'exécution des deux classes de test sur cette référence plutôt que sur leurs propres classes respectives. 

40
rdp

Je ne pouvais pas le comprendre. alors fini par le pirater avec plusieurs fonctions non préfixées par test_:

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

Outre ce que d'autres ont dit, le partage de données entre les méthodes de test ne devrait pas être implémenté de cette façon, utilisez setup () est recommandé 

La méthode de test elle-même doit être isolée. 

0
Gearon