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'.[])中将类的行更改为类的: