Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python __test__=False-magic属性如何用于测试发现_Python - Fatal编程技术网

Python __test__=False-magic属性如何用于测试发现

Python __test__=False-magic属性如何用于测试发现,python,Python,因此,我尝试实现一些类似于单元测试框架如何完成以下工作的东西: 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 InheritingTe

因此,我尝试实现一些类似于单元测试框架如何完成以下工作的东西:

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
这将向我表明,它没有在类型的构造上使用a将
\uu test\uu
设置为
True

我尝试在python库
find中搜索-名称“*.py”| xargs grep'uuu test_uuu'
,但似乎没有找到任何与此相关的内容

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

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

但是我觉得这很脆弱。。。是否有一种更干净/更好的方法在所有情况下都有效?有没有可能一个类不会有一个
\uuu dict\uuu
属性?

有没有可能一个类不会有一个属性?我最初的反应是没有。这可能不是你想要的,因为你可以有一个没有
\uu dict\uuuu>属性的类的实例,如果它有定义
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
且不从已包含
\uuuuuuuuuuuuuuuuuu。请参阅

编辑

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

你所说的行为看起来很奇怪,我觉得很自然@Owen正确地询问了期望有所不同的代码,并感谢您发布对的引用。该框架广泛使用双下划线

Alex Martelli的研究有助于阐明可能发生的情况,但最简单的答案是,双下划线返回上述结果,因为
InheritingTest的点表示法。\uuu test\uuuuu
通过正常的属性解析机制,但通过决定使用前导的双下划线,保留在其类范围内访问它的权利,即使您的子类重写了它


测试框架本质上是神奇的野兽,使用
\uuuu Test\uuuu
hear看起来很合适。我查看了他们的文档,文档看起来很稀疏,因此您使用
\uu test\uuuu
会感到很危险(无论如何,双下划线类型的信号会传递这个“class local”变量)。

您正在使用的库,在第140行的
authentice/test\u discovery.py
中执行以下操作:

    # 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__)):

因此,换句话说,它正以一种更为详细的方式执行您的“猜测”方法所做的事情:它直接测试类
\uuuuu test\uuuuu
\uuu dict\uuuuu
的存在和值。

为什么您认为继承测试是错误的?这个变量的名称解析将首先检查InheritingTest的dict,然后检查找到它的BaseTest的dict。我发现它很奇怪,因为该测试正在运行,尽管它有
\uuuuuuTest\uuuuuu=False
您可以发布决定测试是否应该运行的代码吗?这是什么框架?python2
unittest
文档没有提到这个属性;我以前从未听说过它。我正在使用一个名为
\uuuuu test\uuuuu
的鼻子状测试框架,它有两个尾随下划线,使它免于通常的名称混乱。它不是一个“类本地属性”。除非我大错特错,否则一个带有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu槽的类不一定要有
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu dict\uuuuuuuuuu>@Marcin,更像通常没有
\uuuuuuuuuuuu。这个问题似乎与类级别
\uuuu dict\uuuu
有关,而与实例级别相反<代码>\uuuuuuuuuuuuuuuuuuuuuuuu
表示仪表上没有
\uuuuuuuuuuuuuuuuuuuu指令
。另外,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。