Python >> Tutoriel Python >  >> Python

La meilleure nouvelle fonctionnalité d'unittest dont vous ne saviez pas avoir besoin

De temps en temps j'aime lire la documentation des modules je pense Je sais bien. La documentation python n'est pas une lecture agréable mais parfois vous tombez sur un joyau.

Distinguer les itérations de test

Commençons par une fonction simple pour vérifier si un nombre est pair

def is_even(n):
 return n % 2 == 0

Et un simple test

class TestIsEven(TestCase):

 def test_should_be_even(self):
 self.assertTrue(is_even(2))

Bien, ajoutons quelques cas supplémentaires :

class TestIsEven(TestCase):

 # ...

 def test_zero_should_be_even(self):
 self.assertTrue(is_even(0))

 def test_negative_should_be_even(self):
 self.assertTrue(is_even(-2))

Ceci est un exemple simple et nous avons copié le code trois fois. Essayons de faire mieux en écrivant une boucle pour itérer les valeurs que nous espérons être paires :

class TestIsEven(TestCase):

 def test_should_all_be_even(self):
 for n in (2, 0, -2, 11):
 self.assertTrue(is_even(n))

Cela commence à être plus élégant, alors où est le problème ? J'ai ajouté une valeur impaire, 11, pour échouer au test. Exécutons le test et voyons à quoi il ressemble :

F
===================================================
FAIL: test_should_all_be_even (__main__.TestIsEven)
- - -- - - - - - - - - - - - - - - - - - - - - - -

Traceback (most recent call last):

File "subtest.py", line 18, in test_should_all_be_even
self.assertTrue(is_even(n))
AssertionError: False is not true

Il a échoué comme prévu, mais quelle valeur a échoué ?

Entrez subTest

Dans Python 3.4, il existe une nouvelle fonctionnalité appelée subTest. Voyons-le en action :

class TestIsEven(TestCase):

 def test_should_all_be_even(self):
 for n in (0, 4, -2, 11):
 with self.subTest(n=n):
 self.assertTrue(is_even(n))

L'exécution de ce test produit le résultat suivant :

F
==========================================================
FAIL: test_should_all_be_even (__main__.TestIsEven) (n=11)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Traceback (most recent call last):

File "subtest.py", line 23, in test_should_all_be_even
self.assertTrue(is_even(n))
AssertionError: False is not true

Alors, quelle valeur a échoué ? 11! C'est dans le titre .

À quoi ressemblent plusieurs échecs ?

F
===========================================================
FAIL: test_should_all_be_even (__main__.TestIsEven) (n=3)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Traceback (most recent call last):

File "subtest.py", line 23, in test_should_all_be_even
self.assertTrue(is_even(n))
AssertionError: False is not true

==========================================================
FAIL: test_should_all_be_even (__main__.TestIsEven) (n=5)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Traceback (most recent call last):

File "subtest.py", line 23, in test_should_all_be_even
self.assertTrue(is_even(n))
AssertionError: False is not true

==========================================================
FAIL: test_should_all_be_even (__main__.TestIsEven) (n=11)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Traceback (most recent call last):

File "subtest.py", line 23, in test_should_all_be_even
self.assertTrue(is_even(n))
AssertionError: False is not true

Exactement comme si nous écrivions trois scénarios de test distincts.

Profitez !