【发布时间】:2015-02-09 04:35:54
【问题描述】:
我正在尝试在循环中使用assertRaises,这样我就可以测试多个错误分隔符([',', ':', '-']),而不必为每种情况编写新的测试。我在循环中使用assertRaises 时遇到问题。我做了一个unittest.TestCase 的最小工作示例,它在循环中调用assertRaises:
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() 永远不会被调用。
【问题讨论】:
-
听起来你想做类似的事情:stackoverflow.com/q/3431676/1057429
标签: python unit-testing testing nose