我想为TestCase派生类的变体创建一个生成器。
我试过的是:
import unittest
def create_class(param):
class Test(unittest.TestCase):
def setUp(self):
pass
def test_fail(self):
assert False
return Test
def test_basic():
for i in range(5):
yield create_class(i)
我得到的是:
======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.3/site-packages/nose/case.py", line 268, in setUp
try_run(self.test, names)
File "/usr/lib/python3.3/site-packages/nose/util.py", line 478, in try_run
return func()
TypeError: setUp() missing 1 required positional argument: 'self'
产生实例而不是类(yield create_class(i)()
)给我留下了这个错误:
======================================================================
ERROR: test_1.test_basic
----------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python3.3/site-packages/nose/case.py", line 198, in runTest
self.test(*self.arg)
File "/usr/lib/python3.3/unittest/case.py", line 492, in __call__
return self.run(*args, **kwds)
File "/usr/lib/python3.3/unittest/case.py", line 423, in run
testMethod = getattr(self, self._testMethodName)
AttributeError: 'Test' object has no attribute 'runTest'
有什么想法吗?
答案 0 :(得分:4)
实例化TestCase
时,您应该传递测试的方法名称:
yield create_class(i)('test_fail')
否则名称默认为runTest
(因此您获得的最后一个错误)。
另请注意,测试生成器与TestCase
之间存在奇怪的交互。使用以下代码:
import unittest
def create_class(param):
class Test(unittest.TestCase):
def setUp(self):
pass
def test_fail(self):
print('executed')
assert False
print('after assert')
return Test
def test_basic():
for i in range(5):
yield create_class(i)('test_fail')
我获得了这个输出:
$ nosetests -s
executed
.executed
.executed
.executed
.executed
.
----------------------------------------------------------------------
Ran 5 tests in 0.004s
OK
正如您所看到的,即使assert
有效,测试也不会失败。这可能是因为TestCase
处理AssertionError
,但nose
不期望处理它,因此无法看到测试失败。
这可以从TestCase.run
的文档中看出:
运行测试,将结果收集到作为
result
传递的测试结果对象中。如果省略结果或None,则为临时结果 创建对象(通过调用defaultTestResult()
方法)和 用过的。结果对象不会返回给run()
的调用者。The same effect may be had by simply calling the TestCase instance.
因此,nose
没有看到生成器产生的对象是TestCase
应该以特殊方式处理,它只是期望一个可调用的。运行TestCase
,但结果将被放入丢失的临时对象中,这会消除测试中发生的所有测试失败。因此屈服TestCase
es根本不起作用。
答案 1 :(得分:0)
我已经运行了您提供的代码。我没有收到任何错误。我使用的版本是python2.7。系统是ubuntu12.10。也许你需要检查python2.7。