我正在尝试在循环中使用 assertRaises,这样我就可以测试多个错误的定界符([',', ':', '-'])必须为每个案例编写一个新测试。我在循环中使用 assertRaises 时遇到问题。我制作了一个在循环中调用 assertRaises 的 unittest.TestCase 的最小工作示例:
import sys
import unittest
def throw_error():
sys.stderr.write('In throw error!')
raise TypeError
class Test(unittest.TestCase):
def test_loop(self):
for i in range(5):
self.assertRaises(TypeError, throw_error)
这有效,但它只算作 1 次测试,而我更希望将其理解为 5 次测试。有没有一种规范的方法来获得这种类型的行为?
>>> nosetests ../footest.py
In throw error!
In throw error!
In throw error!
In throw error!
In throw error!
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
我想要这种行为的主要原因是因为这看起来像一个太多的黑盒子,我最终会忘记这是 1 中的 5 个测试。也许像我所做的那样写入 stderr使用自定义消息就足够了,或者您有更好的建议吗?
Falsetru 的回答很好,但我无法根据自己的情况进行调整
Falsetru 的回答作为一个独立示例,但我的 test_loop() 函数需要是 TestCase 的实例方法,因为它需要使用许多属性和方法。因此,当我修改他的答案以仍然使用 TestCase 时,它不再有效:
import sys
import unittest
import nose.tools as ntools
def throw_error():
sys.stderr.write('In throw error!')
raise TypeError
class Test(unittest.TestCase):
def test_loop(self):
for i in range(5):
yield ntools.assert_raises, TypeError, throw_error
这导致输出:
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
意思是 throw_error() 永远不会被调用。
请您参考如下方法:
您使用的 Nose 支持 tests generator :
from nose.tools import assert_raises
def throw_error():
raise TypeError
def test_loop():
for i in range(5):
yield assert_raises, TypeError, throw_error
