Je reçois des tests d'intégration en cours d'exécution contre la base de données, et je voudrais avoir une structure qui ressemble à quelque chose comme ceci:Comment puis-je obtenir le nez pour trouver les attributs de classe définis sur une classe de test de base?
class OracleMixin(object):
oracle = True
# ... set up the oracle connection
class SqlServerMixin(object):
sql_server = True
# ... set up the sql server connection
class SomeTests(object):
integration = True
# ... define test methods here
class test_OracleSomeTests(SomeTests, OracleMixin):
pass
class test_SqlServerSomeTests(SomeTests, SqlServerMixin):
pass
De cette façon, je peux exécuter des tests SQL Server et teste Oracle séparément comme ceci:
nosetests -a oracle
nosetests -a sql_server
Ou tous les tests d'intégration comme celui-ci:
nosetests -a integration
Cependant, il semble que le nez ne chercher attrib utes sur la sous-classe, pas sur la classe de base. Ainsi, je dois définir les classes de test comme celui-ci ou les essais ne courrai pas:
class test_OracleSomeTests(SomeTests, OracleMixin):
oracle = True
integration = True
class test_SqlServerSomeTests(SomeTests, SqlServerMixin):
sql_server = True
integration = True
C'est un peu fastidieuse à maintenir. Des idées sur la façon de contourner cela? Si je ne faisais que traiter une classe de base, j'utiliserais simplement une métaclasse et définirais les attributs de chaque classe. Mais j'ai l'impression d'avoir une métaclasse pour la classe de test, une métaclasse pour Oracle et une métaclasse pour SQL Server.
Si l'une de vos classes parentes sont pas de classes "new-style" (c'est-à-dire qu'elles ne développent pas "object"), je ne pense pas qu'il y aura un attribut '__mro__'. Juste un petit tweak, mais changez la ligne 'pour class_ ...' à 'pour class_ dans getattr (cls, '__mro__', []):' –