[PYTHON] [Mémo] Résumé du code de test

Quel est le but du code de test en un mot?

Éliminer les bogues

Qu'est-ce qu'un code de test?

--Travailler pour vérifier si cela fonctionne correctement

Que se passe-t-il à la suite du code de test?

Il existe trois bibliothèques qui vous aident à tester Python.

  1. unittest

  2. doctest

  3. pytest

  4. unittest Tout d'abord, préparez la fonction calc.py à tester. Ceci est une méthode pour ajouter et soustraire.

calc.py


def add_num(num1, num2):
    return num1 + num2

def sub_num(num1, num2):
    return num1 - num2

Puis testez calc.py avec ʻunit test`.

** 6 étapes pour écrire un programme de test **

  1. Le nom du fichier est "test_target module name.py".
  2. Importez le module unittest.
  3. Le nom de la classe de test doit être "Nom de la classe cible du test".
  4. La classe de test hérite unittest.TestCase.
  5. Le nom de la méthode de test est "nom de la méthode cible test_test".
  6. Exécutez le test avec ʻunittest.main () `.

test_calc.py


# 1.Le nom du fichier est "test"_Nom du module cible.py "
# 2.Importez le module unittest
import unittest
import calc

# 3.Le nom de la classe de test est "Nom de la classe cible du test"
# 4.La classe de test est unittest.Hériter TestCase
class TestCalc(unittest.TestCase):

    # 5.Le nom de la méthode de test est "test"_Le nom de la méthode à tester "
    def test_add_num(self):
        num1 = 10
        num2 = 5
        expected = 15
        actual = calc.add_num(num1, num2)

        #Assert Equal pour voir si vous obtenez les résultats souhaités()Méthode
        self.assertEqual(expected, actual)

    def test_sub_num(self):
        num1 = 10
        num2 = 5
        expected = 5
        actual = calc.sub_num(num1, num2)
        self.assertEqual(expected, actual)

# 6. unittest.main()Exécutez le test sur
if __name__ == "__main__":
    unittest.main()

En l'exécutant avec l'option -v après le nom du fichier, des informations sur le contenu du test seront affichées. Si le calcul est exécuté correctement, il réussit.


$ python test_calc.py -v

test_add_num (__main__.TestCalc) ... ok
test_div_num (__main__.TestCalc) ... ok
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

Les deux scripts cibles sont affichés comme ʻok, vous pouvez donc voir que le test a réussi. Quand ʻunittest.main () est exécuté, toutes les classes qui héritent de ʻunittest.TestCase sont reconnues dans le script cible, et chaque méthode commençant par test` est exécutée comme cas de test.

Enfin, regardons le cas où le test échoue.

test_calc_1.py


# 1.Le nom du fichier est "test"_Nom du module cible.py "
# 2.Importez le module unittest
import unittest
import calc

# 3.Le nom de la classe de test est "Nom de la classe cible du test"
# 4.La classe de test est unittest.Hériter TestCase
class TestCalc(unittest.TestCase):

    # 5.Le nom de la méthode de test est "test"_Le nom de la méthode à tester "
    def test_add_num(self):
        num1 = 10
        num2 = 5
        expected = 15
        actual = calc.add_num(num1, num2)

        #Assert Equal pour voir si vous obtenez les résultats souhaités()Méthode
        self.assertEqual(expected, actual)

    def test_sub_num(self):
        num1 = 10
        num2 = 5
        expected = 6
        actual = calc.sub_num(num1, num2)
        self.assertEqual(expected, actual)

# 6. unittest.main()Exécutez le test sur
if __name__ == "__main__":
    unittest.main()

$ python test_calc.py -v

test_add_num (__main__.TestCalc) ... ok
test_sub_num (__main__.TestCalc) ... FAIL

======================================================================
FAIL: test_sub_num (__main__.TestCalc)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "test_calc.py", line 24, in test_sub_num
    self.assertEqual(expected, actual)
AssertionError: 6 != 5

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)

Il dit test_sub_num (__main__. TestCalc) ... FAIL, et il s'avère que le résultat de la soustraction est incorrect.

Les références

  1. doctest ** 3 étapes pour écrire un programme de test **
  2. Dans la fonction à tester ʻadd_num et sum_num` (la partie entourée par '' '), décrivez l'appel de fonction et la valeur de sortie attendue au format du mode interactif Python.
  3. Importez le module doctest.
  4. Exécutez le test avec doctest.testmod ().

Examinons d'abord le cas où il y a une erreur.

doc.py


class Keisan(object):
    def add_num(self, num1, num2):
        # 1.Décrire l'appel de fonction et la valeur de sortie attendue
        '''Ajouter des arguments
        >>> k = Keisan()
        >>> k.add_num(5, 5)
        10
        '''

        result = num1 + num2
        return result

    def sub_num(self, num1, num2):
        '''Soustraire des arguments
        >>> k = Keisan()
        >>> k.sub_num(5, 5)
        3
        '''

        result = num1 - num2
        return result

# 2.Importez le module doctest
# 3. doctest.testmod()Exécutez le test sur
if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python doc.py

**********************************************************************
File "practice.py", line 15, in __main__.Keisan.sub_num
Failed example:
    k.sub_num(5, 5)
Expected:
    3
Got:
    0
**********************************************************************
1 items had failures:
   1 of   2 in __main__.Keisan.sub_num
***Test Failed*** 1 failures.

La valeur de sortie attendue est affichée dans Attendu et la valeur de sortie réelle est affichée dans Got. Vous pouvez voir que «Got: 0» est correct au lieu de «Attendu: 3».

Ensuite, regardons le cas où il n'y a pas d'erreur.

doc_1.py


class Keisan(object):
    def add_num(self, num1, num2):
        # 1.Décrire l'appel de fonction et la valeur de sortie attendue
        '''Ajouter des arguments
        >>> k = Keisan()
        >>> k.add_num(5, 5)
        10
        '''

        result = num1 + num2
        return result

    def sub_num(self, num1, num2):
        '''Soustraire des arguments
        >>> k = Keisan()
        >>> k.sub_num(5, 5)
        0
        '''

        result = num1 - num2
        return result

# 2.Importez le module doctest
# 3. doctest.testmod()Exécutez le test sur
if __name__ == '__main__':
    import doctest
    doctest.testmod()
$ python doc.py

Remplacement de «Attendu: 3» par «Attendu: 0». J'ai constaté que s'il n'y avait aucune erreur, rien n'était affiché.

Les références

  1. pytest

Tout d'abord, installez pytest.

$ pip install pytest

Ensuite, préparez la fonction practice.py à tester. Ceci est une méthode pour ajouter et soustraire.

practice.py


class Practice(object):

    def __init__(self, num1, num2):
        self.num1 = num1
        self.num2 = num2

    def add_num(self):
        return self.num1 + self.num2

    def sub_num(self):
        return self.num1 - self.num2

Puis testez par rapport à «practice.py» en utilisant «pytest».

** 6 étapes pour écrire un programme de test **

  1. Le nom du fichier est "test_target module name.py".
  2. Le nom de la méthode de test est "nom de la méthode cible test_test".
  3. Exécutez le test avec ʻassert`.

test_practice.py


# 1.Le nom du fichier est "test"_Nom du module cible.py "
from practice import Practice

# 2.Le nom de la méthode de test est "test"_Le nom de la méthode à tester "
def test_add_num():
    # 3.Exécutez le test avec assert
    assert Practice(5, 5).add_num() == 10

def test_sub_num():
    assert Practice(5, 5).sub_num() == 10

Exécutez avec pytest devant le nom du fichier.

$ pytest test_practice.py

=============================== test session starts ================================
platform win32 -- Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: C:\Users\Yusuke\Desktop\blog\test
collected 2 items                                                                   

test_practice.py .F                                                           [100%]

===================================== FAILURES =====================================
___________________________________ test_sub_num ___________________________________

    def test_sub_num():
>       assert Practice(5, 5).sub_num() == 10
E       assert 0 == 10
E        +  where 0 = <bound method Practice.sub_num of <practice.Practice object at
0x00000210F2B21070>>()
E        +    where <bound method Practice.sub_num of <practice.Practice object at 0x
00000210F2B21070>> = <practice.Practice object at 0x00000210F2B21070>.sub_num
E        +      where <practice.Practice object at 0x00000210F2B21070> = Practice(5,
5)

test_practice.py:7: AssertionError
============================= short test summary info ==============================
FAILED test_practice.py::test_sub_num - assert 0 == 10
=========================== 1 failed, 1 passed in 0.24s ============================

Le bref résumé de test info FAILED indique test_practice.py :: test_sub_num --assert 0 == 10, indiquant que le résultat de la soustraction est incorrect.

Remplacez le résultat de la soustraction de «10» à «0» et vérifiez s'il n'y a pas d'erreur.

test_practice_1.py


# 1.Le nom du fichier est "test"_Nom du module cible.py "
from practice import Practice

# 2.Le nom de la méthode de test est "test"_Le nom de la méthode à tester "
def test_add_num():
    # 3.Exécutez le test avec assert
    assert Practice(5, 5).add_num() == 10

def test_sub_num():
    assert Practice(5, 5).sub_num() == 0
$ pytest test_practice_1.py

=============================== test session starts ================================
platform win32 -- Python 3.8.2, pytest-5.4.1, py-1.8.1, pluggy-0.13.1
rootdir: C:\Users\Yusuke\Desktop\blog\test
collected 2 items                                                                   

test_practice.py ..                                                           [100%]

================================ 2 passed in 0.03s =================================

C'est "2 passé en 0.03s", et vous pouvez voir que le résultat était correct.

Les références

Recommended Posts

[Mémo] Résumé du code de test
Renforcez avec le test de code ⑦
Renforcez avec le test de code ③
Renforcez avec le test de code ⑤
Renforcez avec le test de code ④
Renforcez avec le test de code ①
Résumé de la méthode d'essai
Renforcez avec le test de code ⑧
Renforcez avec le test de code ⑨
Résumé et code du papier Adam
Code de test pour évaluer les décorateurs
Mémo récapitulatif des types de données Python
[mémo] Java FizzBuzz Code Golf
[Mémo d'apprentissage] Résumé de la commande Django
tester
Ecrire le code de test du sélénium en python
Résumé de l'exemple de code de traitement parallèle / parallèle Python
[Test Driven Development (TDD)] Chapitre 21 Résumé
N'est-il pas acceptable d'écrire du code de test?
Résumé du tutoriel Django pour les débutants par les débutants ⑤ (test)
python setup.py tester le code en utilisant le multiprocessus