为了减少锅炉板代码,我想到了在类Tester中为所有无参数方法生成测试用例的想法 .
在运行py.test时,它只识别静态编写的测试用例(test_a,test_b),但不识别使用 setattr(Tester,'test_' + name, member)
动态创建的测试用例
也许py.test在调用setUpClass之前已经检查了类Tester的'test_ *'方法?任何提示如何运行?
import inspect
import unittest
class Testee:
def a(self):
print('a')
def b(self):
print('b')
#...
#...
def z(self):
print('z')
class Tester(unittest.TestCase):
@classmethod
def setUpClass(cls):
testee = Testee()
for name, member in inspect.getmembers(object=testee, predicate=inspect.ismethod or inspect.iscoroutine):
if len(inspect.signature(member).parameters):
print(str(inspect.signature(member).parameters))
setattr(Tester,'test_' + name, member)
if inspect.isfunction(member) or inspect.ismethod(member):
setattr(Tester,'test_' + name, member)
elif inspect.iscoroutinefunction(member):
setattr(Tester,'test_' + name, functools.partialmethod(TestInstrument.run_coro, member))
else:
print(member)
return super().setUpClass()
def test_a(self):
Tester.testee.a()
def test_b(self):
Tester.testee.b()
=============================测试会话开始================= ============平台win32 - Python 3.5.1,pytest-2.9.2,py-1.4.31,pluggy-0.3.1 - c:\ program files \ python35 \ python . exe cachedir:.cache rootdir:C:\ tests,inifile:收集了两个项目sandbox.py::Tester::test_a PASSED sandbox.py::Tester::test_b PASSED ============= ============= 2在0.03秒内通过===========================
EDIT :如果我将setupClass中的代码移动到全局作用域(类外),则py.test会检测并运行自动生成的测试用例 .
1 回答
要详细说明我的'EDIT',一个选择就是这样 . 我对解决方案不满意,因为全局代码执行会对副作用和其他微妙的错误开放 . 关于如何将其纳入类
Tester
范围的任何建议?py.test. output: