Skip to main content
 首页 » 编程设计

python之循环 : 1 test per iteration 中的 assertRaises

2025年05月04日15think

我正在尝试在循环中使用 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