gpt4 book ai didi

python - Nose:基于 TestCase 的类的生成器

转载 作者:太空宇宙 更新时间:2023-11-03 15:20:50 24 4
gpt4 key购买 nike

我想为 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'

有什么想法吗?

最佳答案

当实例化一个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 处理了 AssertionErrornose 不期望它被处理,因此它看不到测试失败了。

这可以从TestCase.run的文档中看出:

Run the test, collecting the result into the test result object passed as result. If result is omitted or None, a temporary result object is created (by calling the defaultTestResult() method) and used. The result object is not returned to run()‘s caller.

The same effect may be had by simply calling the TestCase instance.

因此,nose 没有看到生成器生成的对象是一个应该以特殊方式处理的 TestCase,它只是期望一个可调用对象。 TestCase 已运行,但结果被放入一个丢失的临时对象中,这会吞噬测试中发生的所有测试失败。因此,生成 TestCasees 根本行不通。

关于python - Nose:基于 TestCase 的类的生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15281881/

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