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 !