Unittest de Python et création dynamique de cas de test [dupliquer]
Doublon Possible:
comment générer des tests unitaires dynamiques (paramétrés) en python?
Existe-t-il un moyen de créer dynamiquement des cas de test unittest
? J'ai essayé ce qui suit..
class test_filenames(unittest.TestCase):
def setUp(self):
for category, testcases in files.items():
for testindex, curtest in enumerate(testcases):
def thetest():
parser = FileParser(curtest['input'])
theep = parser.parse()
self.assertEquals(theep.episodenumber, curtest['episodenumber'])
setattr(self, 'test_%s_%02d' % (category, testindex), thetest)
..ce qui crée toutes les méthodes correctement (elles apparaissent dans dir()
et sont appelables), mais le détecteur de test d'unittest, Ni nosetest
Les exécute ("Ran 0 tests in ...")
Puisque je peux poser la mauvaise question-ce que j'essaie de atteindre:
J'ai un fichier contenant des données de test, une liste de noms de fichiers d'entrée et des données attendues (simplifiées en episodenumber
dans le code ci-dessus), stockées dans un dictionnaire Python. La clé est la catégorie, la valeur est une liste de cas de test, par exemple..
test_cases = {}
test_cases['example_1'] = [
{'input': 'test.01',
'episodenumber': 1},
{'input': 'test.02',
'episodenumber': 2}
]
test_cases['example_2'] = [
{'input': 'another.123',
'episodenumber': 123},
{'input': 'test.e42',
'episodenumber': 32}
]
Actuellement, je boucle juste sur toutes les données, appelle self.assertEquals
sur chaque test. Le problème est que si l'on échoue, Je ne vois pas le reste des échecs car ils sont également regroupés en un seul test, qui s'annule lorsqu'une assertion échoue.
Le chemin autour de cela, je pensais, serait de (dynamiquement) créer une fonction pour chaque cas de test, peut-être y a-t-il un meilleur moyen?
3 réponses
Pour cela, vous devez utiliser le test générateurs dans le nez. Tout ce que vous devez faire est de donner un tuple, le premier étant une fonction et le reste étant les args. À partir de la documentation voici l'exemple.
def test_evens():
for i in range(0, 5):
yield check_even, i, i*3
def check_even(n, nn):
assert n % 2 == 0 or nn % 2 == 0
Dans la solution suivante, la classe Tests
contient la méthode d'Assistance check
et aucun cas de test défini statiquement. Ensuite, ajouter dynamiquement un cas de test, j'utilise setattr
pour définir des fonctions de la classe. Dans l'exemple suivant, je génère des cas de test test_<i>_<j>
avec i et j couvrant respectivement [1,3] et [2,5], qui utilisent la méthode d'Assistance check
avec des valeurs différentes de i et J.
class Tests(unittest.TestCase):
def check(self, i, j):
self.assertNotEquals(0, i-j)
for i in xrange(1, 4):
for j in xrange(2, 6):
def ch(i, j):
return lambda self: self.check(i, j)
setattr(Tests, "test_%r_%r" % (i, j), ch(i, j))
J'ai posté une solution à une question similaire, qui devrait vous donner des conseils sur la façon de faire. Il est basé sur la métaclasse et les décorateurs.