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?

22
demandé sur Community 2009-07-28 16:55:40

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
12
répondu David Raznick 2012-11-05 16:30:42

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))
23
répondu Adrian Panasiuk 2013-05-03 21:45:06

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.

Python unittest: générer plusieurs tests par programme?

2
répondu Xavier Decoret 2017-05-23 12:32:58