Maison > Article > développement back-end > Comment puis-je implémenter des tests unitaires dynamiques avec paramétrage en Python ?
Tests unitaires dynamiques en Python avec paramétrage
Introduction
La paramétrisation est une technique en unité testing qui automatise la création de tests avec différents ensembles de données d'entrée. Cela permet aux développeurs de tester minutieusement leur code avec divers scénarios, garantissant sa robustesse et sa fiabilité.
Paramétrage avec le décorateur de pytest
Une option populaire de paramétrage consiste à utiliser le décorateur de pytest. Ajoutez simplement le décorateur @parametrize à votre classe de test, suivi d'une liste de valeurs comme suit :
from pytest import mark class TestSequence(unittest.TestCase): @mark.parametrize( ["name", "a", "b"], [ ["foo", "a", "a"], ["bar", "a", "b"], ["lee", "b", "b"], ] ) def test_sequence(self, name, a, b): self.assertEqual(a, b)
Ce décorateur générera automatiquement un test distinct pour chaque ensemble de valeurs de la liste.
Paramétrage avec bibliothèque paramétrée
Une autre option consiste à utiliser la bibliothèque paramétrée. Voici à quoi ressemblerait le même test en utilisant cette bibliothèque :
from parameterized import parameterized class TestSequence(unittest.TestCase): @parameterized.expand([ ["foo", "a", "a"], ["bar", "a", "b"], ["lee", "b", "b"], ]) def test_sequence(self, name, a, b): self.assertEqual(a, b)
Dans les deux cas, le résultat est le même : plusieurs tests sont générés en fonction des données fournies, vous permettant de tester votre code en profondeur.
Approche originale de paramétrage
Bien que les méthodes décrites ci-dessus soient modernes et largement utilisées, il existait une approche plus ancienne qui générait des tests méthodes de manière dynamique. Cependant, cette approche n'est plus couramment utilisée et n'est évoquée que pour des raisons historiques :
import unittest l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]] class TestSequense(unittest.TestCase): pass def test_generator(a, b): def test(self): self.assertEqual(a,b) return test if __name__ == '__main__': for t in l: test_name = 'test_%s' % t[0] test = test_generator(t[1], t[2]) setattr(TestSequense, test_name, test) unittest.main()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!