我正在对数据库运行一些集成测试,我想要一个看起来像这样的结构:
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
这样,我可以像这样分别运行 SQL Server 测试和 Oracle 测试:
nosetests -a oracle
nosetests -a sql_server
或者像这样的所有集成测试:
nosetests -a integration
但是,nose 似乎只会在子类上查找属性,而不会在基类上查找。因此我必须像这样定义测试类,否则测试将不会运行:
class test_OracleSomeTests(SomeTests, OracleMixin):
oracle = True
integration = True
class test_SqlServerSomeTests(SomeTests, SqlServerMixin):
sql_server = True
integration = True
维护起来有点乏味。任何想法如何解决这个问题?如果我只处理一个基类,我将只使用一个元类并在每个类上定义属性。但是我对测试类有一个元类、Oracle 有一个元类和 SQL Server 有一个元类感到不安。
最佳答案
我不认为你可以不制作自己的插件。 attrib 插件中的代码只查看类 __dict__
。这是 code
def wantClass(self, cls):
"""Accept the class if the class or any method is wanted.
"""
cls_attr = cls.__dict__
if self.validateAttrib(cls_attr) is not False:
return None
...
你可以破解插件来做类似的事情(未测试)。
def wantClass(self, cls):
"""Accept the class if the class or any method is wanted.
"""
for class_ in cls.__mro__:
cls_attr = class_.__dict__
if self.validateAttrib(cls_attr) is not False:
return None
cls_attr = cls.__dict__
...
但是,我不确定这比元类选项好还是坏。
关于python - 我怎样才能找到在基础测试类上定义的类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188922/