57 votes

cas de test abstrait utilisant python unittest

Est-il possible de créer un résumé TestCase , qui aura des méthodes test_*, mais ce TestCase ne sera pas appelé et ces méthodes ne seront utilisées que dans les sous-classes ? Je pense que je vais avoir un résumé TestCase dans ma suite de tests et il sera sous-classé pour quelques implémentations différentes d'une seule interface. C'est pourquoi toutes les méthodes de test sont des changements de méthode internes, un seul. Comment puis-je le faire de manière élégante?

19voto

o11c Points 1687

Il y a un moyen très simple que tout le monde a manqué jusqu'à présent. Et contrairement à plusieurs des réponses, cela fonctionne avec tous les pilotes d'essai, plutôt que d'échouer à la minute où vous basculez entre eux.

Utilisez simplement l'héritage comme d'habitude, puis ajoutez :

 del AbstractTestCase

à la fin du module.

11voto

jrobichaud Points 605

Si vous voulez vraiment utiliser l'héritage au lieu des mixins, une solution simple consiste à imbriquer le test abstrait dans une autre classe.

Cela évite les problèmes de découverte du lanceur de test et vous pouvez toujours importer le test abstrait à partir d'un autre module.

 import unittest

class AbstractTests(object):
    class AbstractTest(unittest.TestCase)
        def test_a(self):
            print "Running for class", self.__class__

class Test(AbstractTests.AbstractTest):
    pass

9voto

Dan Ward Points 28

Juste pour mettre mes deux cents, même si cela va probablement à l'encontre de certaines conventions, vous pouvez définir votre cas de test abstrait en tant que membre protégé pour empêcher son exécution. J'ai implémenté ce qui suit dans Django et fonctionne comme requis. Voir exemple ci-dessous.

 from django.test import TestCase


class _AbstractTestCase(TestCase):

    """
    Abstract test case - should not be instantiated by the test runner.
    """

    def test_1(self):
        raise NotImplementedError()

    def test_2(self):
        raise NotImplementedError()


class TestCase1(_AbstractTestCase):

    """
    This test case will pass and fail.
    """

    def test_1(self):
        self.assertEqual(1 + 1, 2)


class TestCase2(_AbstractTestCase):

    """
    This test case will pass successfully.
    """

    def test_1(self):
        self.assertEqual(2 + 2, 4)

    def test_2(self):
        self.assertEqual(12 * 12, 144)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X