Python 如何让nose查找在基本测试类上定义的类属性?

Python 如何让nose查找在基本测试类上定义的类属性?,python,integration-testing,multiple-inheritance,nose,mixins,Python,Integration Testing,Multiple Inheritance,Nose,Mixins,我正在对数据库运行一些集成测试,我希望有一个如下结构: 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

我正在对数据库运行一些集成测试,我希望有一个如下结构:

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
nosetests -a oracle
nosetests -a sql_server
nosetests -a integration
这样,我可以分别运行SQL Server测试和Oracle测试,如下所示:

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
nosetests -a oracle
nosetests -a sql_server
nosetests -a integration
或者像这样的所有集成测试:

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
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插件中的代码只查看类
\uuuu dict\uuuu
。这是你的电话号码

你可以破解插件来做一些类似(未测试)的事情


但是,我不确定这比元类选项更好还是更差。

如果要查找父类上定义的属性,并且子类中有同名属性,则需要添加父类的名称以访问所需的范围

我相信这就是你想要的:

在您的例子中,看起来您有两个不同的类,它们定义了不同的变量,因此您可以在测试函数的顶部或初始值设定项中使用try:catch

并说

try:
   isSQLServer = self.sql_server
except AttributeError:
   isSQLServer = False

(尽管它们实际上应该定义相同的变量,这样测试类就不必知道关于子类的任何信息)

如果您的父类不是“新样式”类(也就是说,它们不扩展“对象”),我不认为会有
\umro\uu
属性。只是一个小的调整,但是在getattr(cls,'.'.'mro'.[])中将类的行
更改为类的