gpt4 book ai didi

python - Nose 、unittest.TestCase 和元类 : auto-generated test_* methods not discovered

转载 作者:太空狗 更新时间:2023-10-29 17:44:29 25 4
gpt4 key购买 nike

这是 unittest and metaclass: automatic test_* method generation 的后续问题:

对于这个(固定的)unittest.TestCase 布局:

#!/usr/bin/env python

import unittest


class TestMaker(type):

def __new__(cls, name, bases, attrs):
callables = dict([
(meth_name, meth) for (meth_name, meth) in attrs.items() if
meth_name.startswith('_test')
])

for meth_name, meth in callables.items():
assert callable(meth)
_, _, testname = meth_name.partition('_test')

# inject methods: test{testname}_v4,6(self)
for suffix, arg in (('_false', False), ('_true', True)):
testable_name = 'test{0}{1}'.format(testname, suffix)
testable = lambda self, func=meth, arg=arg: func(self, arg)
attrs[testable_name] = testable

return type.__new__(cls, name, bases, attrs)


class TestCase(unittest.TestCase):

__metaclass__ = TestMaker

def test_normal(self):
print 'Hello from ' + self.id()

def _test_this(self, arg):
print '[{0}] this: {1}'.format(self.id(), str(arg))

def _test_that(self, arg):
print '[{0}] that: {1}'.format(self.id(), str(arg))


if __name__ == '__main__':
unittest.main()

这使用 stdlib 的框架工作。预期和实际输出:

C:\Users\santa4nt\Desktop>C:\Python27\python.exe test_meta.py
Hello from __main__.TestCase.test_normal
.[__main__.TestCase.test_that_false] that: False
.[__main__.TestCase.test_that_true] that: True
.[__main__.TestCase.test_this_false] this: False
.[__main__.TestCase.test_this_true] this: True
.
----------------------------------------------------------------------
Ran 5 tests in 0.015s

OK

但是,因为我实际使用的是 nose ,这一招似乎不太认同。我得到的输出是:

C:\Users\santa4nt\Desktop>C:\Python27\python.exe C:\Python27\Scripts\nosetests test_meta.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

简而言之,元类生成的test_* 方法没有向nose 注册。 .任何人都可以阐明这一点吗?

谢谢,

最佳答案

因此,在研究了两个标准库的 unittest 之后和 nose 的加载器和选择器源代码,事实证明 nose 覆盖了 unittest.TestLoader.getTestCaseNames使用自己的选择器(带有插件点)。

现在,nose 的选择器寻找潜在方法的 method.__name__匹配某些正则表达式、黑白名单和插件的决定。

在我的例子中,动态生成的函数有它的 testable.__name__ == '<lambda>' , 不匹配 nose 的任何选择器标准。

修复,

        # inject methods: test{testname}_v4,6(self)
for suffix, arg in (('_false', False), ('_true', True)):
testable_name = 'test{0}{1}'.format(testname, suffix)
testable = lambda self, arg=arg: meth(self, arg)
testable.__name__ = testable_name # XXX: the fix
attrs[testable_name] = testable

果然:

(sandbox-2.7)bash-3.2$ nosetests -vv 
test_normal (test_testgen.TestCase) ... ok
test_that_false (test_testgen.TestCase) ... ok
test_that_true (test_testgen.TestCase) ... ok
test_this_false (test_testgen.TestCase) ... ok
test_this_true (test_testgen.TestCase) ... ok

----------------------------------------------------------------------
Ran 5 tests in 0.005s

OK

关于python - Nose 、unittest.TestCase 和元类 : auto-generated test_* methods not discovered,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5176396/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com