Python Nose:基于测试用例类的生成器
我想为TestCase派生类的变体创建一个生成器 我尝试的是:Python Nose:基于测试用例类的生成器,python,python-3.x,nose,Python,Python 3.x,Nose,我想为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
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'
有什么想法吗?我已经运行了您提供的代码。我没有收到任何错误。我使用的版本是python2.7。系统为ubuntu12.10。也许你需要检查一下python2.7 实例化
测试用例时
应该传递测试的方法名称:
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
不希望处理该错误,因此它无法看到测试失败
这可以从以下文件中看出:
运行测试,将结果收集到作为result
传递的测试结果对象中。如果结果被省略或无,则为临时结果
对象被创建(通过调用defaultTestResult()
方法)并
用过。结果对象不会返回到run()
的调用者
The same effect may be had by simply calling the TestCase instance.
因此,
nose
没有看到生成器生成的对象是一个应以特殊方式处理的TestCase
,它只需要一个可调用的对象。运行TestCase
,但结果被放入一个丢失的临时对象中,这会吃掉测试中发生的所有测试失败。因此,产生TestCase
es根本不起作用。好吧,那么对我来说这似乎是一个bug。我在Python3.3上使用nose,也许这就是问题所在。我不能(也不想)将项目切换回Python2.x,所以我只想同时解决这个问题……如果我在测试中有多个方法怎么办?明确地传递这些似乎是对干燥原则的严重违反…@dom0我认为你应该仔细阅读关于鼻子的文档。你把事情搞混了TestCase
es并不是设计成这样使用的,显然这会导致次优代码。