web-dev-qa-db-fra.com

Pourquoi assertDictEqual est-il nécessaire si les repères peuvent être comparés par `==`?

Pour être honnête, j’ai toujours utilisé assertDictEqual, car lorsque je ne l’utilisais pas, j’obtenais de l’information, les points égaux n’étaient pas les mêmes.

Mais ... je sais que les dict peuvent être comparés par == _ opérateur:

>>> {'a':1, 'b':2, 'c': [1,2]} == {'b':2, 'a':1, 'c': [1,2]}
True

Où puis-je avoir besoin de assertDictEqual?

42
trikoder_beta

Fondamentalement, cela permet à unittest de vous donner plus d'informations sur pourquoi le test a échoué. Comparez ces deux tests:

class DemoTest(unittest.TestCase):

    D1 = {'a': 1, 'b': 2, 'c': [1, 2]}
    D2 = {'a': 1, 'b': 2, 'c': [1]}

    def test_not_so_useful(self):
        assert self.D1 == self.D2

    def test_useful(self):
        self.assertDictEqual(self.D1, self.D2)

Et leurs sorties:

Failure
Traceback (most recent call last):
  File "...x.py", line 86, in test_not_so_useful
    assert self.D1 == self.D2
AssertionError

vs.

Failure
Traceback (most recent call last):
  File "...x.py", line 80, in test_useful
    self.assertDictEqual(self.D1, self.D2)
AssertionError: {'a': 1, 'c': [1, 2], 'b': 2} != {'a': 1, 'c': [1], 'b': 2}
- {'a': 1, 'b': 2, 'c': [1, 2]}
?                         ---

+ {'a': 1, 'b': 2, 'c': [1]}

Dans le dernier cas, vous pouvez voir exactement quelle était la différence, vous n’aurez pas à vous débrouiller tout seul. Notez que vous pouvez simplement utiliser le assertEqual standard au lieu de assertDictEqual, avec le même résultat; par les docs

... il n’est généralement pas nécessaire d’appeler directement ces méthodes.

67
jonrsharpe

Cela fait partie d'une question plus large:

Pourquoi unittest a-t-il toutes les affirmations spéciales?

La réponse est que le travail principal des méthodes UnitTest assert * consiste à vous donner une sortie significative lorsqu'un test échoue. Jetez un coup d'œil au code du module le plus incertain - c'est vraiment ce qu'ils font (seulement ce qu'ils font ??)

Etant donné que Python est un langage dynamique avec une introspection facile, pourquoi ne pas déranger cela? Et la réponse est "car unitest a été porté depuis le Java paquet Junit, et c'est comme cela qu'ils l'ont fait dans Java (et probablement, étant donné à quel point il est difficile/impossible de faire l'introspection au moment de l'exécution).

Donc, ma recommandation: à moins que vous n'écriviez des tests pour la bibliothèque standard, n'utilisez pas le moins du monde - cela ne fait que gêner. J'utilise pytest, nez peut être une bonne option aussi. Il est plus facile et plus rapide d’écrire des tests et vous obtenez un excellent rapport lorsque vous obtenez des erreurs.

Il comprend également de nombreuses fonctionnalités astucieuses pour les tests paramétrés, les montages, la configuration des tests, les moqueries, etc.

Si vous êtes sur un projet qui utilise déjà unitest, vous pouvez toujours exécuter vos tests avec pytest et bénéficier de nombreux avantages.

1
Chris Barker

Je suppose que cela se passe dans le contexte de la fatigue. La méthode assertDictEqual non seulement compare les dessins et s’évalue à True ou False mais peut également vous donner des informations supplémentaires. Telles que les différences exactes entre les deux dict.

De plus, dans un bon IDE, les unittests s'intégreront bien. Vous pouvez simplement ajouter un TestCase, utilisez assertDictEqual et le IDE trouvera et exécutera le test pour vous. La sortie est ensuite affichée dans un format facile à lire, ce qui peut vous faire économiser beaucoup de code passe-partout.

Je serais très intéressé par un cas où deux chiffres égaux ne sont pas égaux par rapport à "==".

1
lhk