[PYTHON] Écrivez un test unitaire flexible avec PyHamcrest!

introduction

Y a-t-il un type List dans le type Dict dans le test unitaire de python, et il réussit ou ne passe pas à chaque fois que vous testez? J'étais inquiet à ce sujet, alors je vais l'écrire ici. L'indice de la solution a été donné à partir de ce site (1). Je vous remercie.

Où assertEqual ne peut pas gérer

Ici J'ai écrit le test suivant en référence à (2).

import unittest


class VTest(unittest.TestCase):

    maxDiff = None

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_v(self):
         first_json = {
            'kind': 'voiceroid',
            'items': [
                {'name': 'aoi'},
                {'name': 'akane'},
                {'name': 'yukari'}
            ]
        }

        second_json = {
            'kind': 'voiceroid',
            'items': [
                {'name': 'yukari'},
                {'name': 'aoi'},
                {'name': 'akane'},
            ]
        }
        self.assertEqual(first_json, second_json)


if __name__ == "__main__":
    unittest.main()

Pour le moment, l'ordre des articles n'a pas d'importance - tant qu'il y a du contenu ... Donc, personnellement, c'est un test OK. Mais quand tu le bouges réellement

F
======================================================================
FAIL: test_v (__main__.VTest)
----------------------------------------------------------------------
Traceback (most recent call last):
  File ".\v_test.py", line 34, in test_v
    self.assertEqual(first_json, second_json)
AssertionError: {'kin[20 chars]ems': [{'name': 'aoi'}, {'name': 'akane'}, {'name': 'yukari'}]} != {'kin[20 chars]ems': [{'name': 'yukari'}, {'name': 'aoi'}, {'name': 'akane'}]}
- {'items': [{'name': 'aoi'}, {'name': 'akane'}, {'name': 'yukari'}],
+ {'items': [{'name': 'yukari'}, {'name': 'aoi'}, {'name': 'akane'}],
   'kind': 'voiceroid'}

----------------------------------------------------------------------
Ran 1 test in 0.001s

FAILED (failures=1)

Je me fâche comme ça. Non, personnellement ... je ne peux rien dire qui ne soit pas bon. C'est la «fonction assertEqual». Par conséquent, PyHamcrest (3) est une bibliothèque qui répond de manière flexible à la demande selon laquelle les valeurs sont importantes mais aucun ordre n'est requis. Parce que c'est une bibliothèque externe

pip install PyHamcrest

Après l'installation avec, réécrivez le code ci-dessus comme suit.

from hamcrest import *
import unittest


class VTest(unittest.TestCase):

    maxDiff = None

    def setUp(self):
        pass

    def tearDown(self):
        pass

    def test_v(self):
        first_json = {
            'kind': 'voiceroid',
            'items': [
                {'name': 'aoi'},
                {'name': 'akane'},
                {'name': 'yukari'}
            ]
        }

        second_json = {
            'kind': 'voiceroid',
            'items': [
                {'name': 'yukari'},
                {'name': 'aoi'},
                {'name': 'akane'}
            ]
        }

        # self.assertEqual(first_json, second_json)
        assert_that(first_json, second_json)


if __name__ == "__main__":
    unittest.main()

Cela a juste changé la fonction assertEqual '' `` en assert_that fonction` ``. Ensuite, quand je le teste ...

.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

Vous l'avez passé proprement.

à la fin

Si vous êtes en difficulté parce que les éléments sont importants mais que l'ordre n'est pas si important, pourquoi ne pas essayer? Tutoriel PyHamcrest (4) est ici. Il y en a beaucoup, alors essayez-en d'autres. Je suis sûr que le test sera flexible!

référence

(1) Python unittest - asserting dictionary with lists (2) Code de test Python à essayer dans les plus brefs délais (3) PyHamcrest (4) PyHamcrest Tutorial

Recommended Posts

Écrivez un test unitaire flexible avec PyHamcrest!
Écrivez facilement if-elif avec lambda
Écrivons python avec cinema4d.
Écrire en csv avec Python
[Python] Ecrire dans un fichier csv avec Python
Ecrire un réseau résiduel avec TFLearn
Écrivez FW sur TWE-Lite avec TWE-Lite R.
Écrire Reversi AI avec Keras + DQN
Écrire un histogramme empilé avec matplotlib
Ecrire un script batch avec Python3.5 ~