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?
Réponses
Trop de publicités?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.
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
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)