13

所以我试图实现类似于单元测试框架如何做以下事情的东西:

class BaseTest(T.TestCase):
    # Disables this test from being run
    __test__ = False

    def test_foo(self): pass


# However this test is picked up because it doesn't directly have __test__ set
class InheritingTest(BaseTest): pass

我觉得很奇怪的一点:

# >> InheritingTest.__test__
# False

这向我表明它没有使用元类来设置 类型__test__True构造。

我尝试通过 python 库搜索find . -name "*.py" | xargs grep '__test__',但似乎没有找到与此相关的任何内容。

我解决这个问题的“猜测”方法是执行以下操作:

def is_class_tested(cls):
    return cls.__dict__.get('__test__', True)

然而,这对我来说感觉很脆弱......有没有一种更清洁/更好的方法可以在所有情况下都有效?有没有可能一个类没有__dict__属性?

4

2 回答 2

3

您正在使用的库 Testify 在testify/test_discovery.py第 140 行左右执行以下操作:

    # it's not a list, it's not a bare module - let's see if it's an honest-to-god TestCaseBase
    elif isinstance(test_module, MetaTestCase) and (not '__test__' in test_module.__dict__ or bool(test_module.__test__)):
        ...
    # detect unittest test cases
    elif issubclass(test_module, unittest.TestCase) and (not '__test__' in test_module.__dict__ or bool(test_module.__test__)):

因此,换句话说,它完全按照您的“猜测”方法所做的事情,以一种稍微冗长的方式:它直接测试__test__类中的存在和值__dict__

于 2013-08-26T13:52:27.360 回答
-1

一个类是否有可能没有 __dict__ 属性?我对此的最初反应是否定的。这可能不是要问的,因为您可以拥有一个没有 a 的类的实例,__dict__如果它定义__slots__并且不从__dict__已经在其中的类继承。请参阅Python 数据模型说明__slots__中的说明

编辑

正如@nneonneo 所指出的,下面关于双下划线的评论不正确,因为后面有下划线。内容因历史原因而保留。

你声称的行为看起来很奇怪,我认为看起来很自然。@Owen 正确地询问了期望不同的代码,并感谢您发布对 Yelp/Testify的引用。该框架广泛使用了 double_underscore。

Alex Martelli在 double_underscore 上的 SO 回答有助于阐明可能发生的情况,但最简短的回答是双下划线返回上面的结果,因为点表示法InheritingTest.__test__通过正常的属性解析机制,但通过 Testify 框架,通过决定使用前导双下划线,即使您的子类覆盖它,也保留在其类范围内访问它的权利。

就其本质而言,测试框架是神奇的野兽,并且使用__test__hear 看起来很合适。我检查了他们的文档,文档感觉很稀疏,所以你的使用__test__感觉很危险(双下划线类型的信号无论如何都会放弃这个“类本地”变量)。

于 2013-08-26T13:25:55.320 回答