我想编写一个测试,以确定在给定的情况下不会引发异常。

测试是否引发异常是很简单的…

sInvalidPath=AlwaysSuppliesAnInvalidPath()
self.assertRaises(PathIsNotAValidOne, MyObject, sInvalidPath) 

... 但你怎么能反其道而行之呢。

像这样的东西是我所追求的…

sValidPath=AlwaysSuppliesAValidPath()
self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath) 

当前回答

嗨,我想写一个测试来确定在给定的情况下不会引发异常。

这是默认的假设——不引发异常。

如果你什么都没说,那在每个测试中都是假设的。

你不需要为它写任何断言。

其他回答

我发现monkey-patch unittest很有用,如下所示:

def assertMayRaise(self, exception, expr):
  if exception is None:
    try:
      expr()
    except:
      info = sys.exc_info()
      self.fail('%s raised' % repr(info[0]))
  else:
    self.assertRaises(exception, expr)

unittest.TestCase.assertMayRaise = assertMayRaise

这在测试异常是否存在时阐明了意图:

self.assertMayRaise(None, does_not_raise)

这也简化了循环测试,我经常这样做:

# ValueError is raised only for op(x,x), op(y,y) and op(z,z).
for i,(a,b) in enumerate(itertools.product([x,y,z], [x,y,z])):
  self.assertMayRaise(None if i%4 else ValueError, lambda: op(a, b))

如果您将一个Exception类传递给assertRaises(),则会提供一个上下文管理器。这可以提高测试的可读性:

# raise exception if Application created with bad data
with self.assertRaises(pySourceAidExceptions.PathIsNotAValidOne):
    application = Application("abcdef", "")

这允许您测试代码中的错误用例。

在本例中,您正在测试将无效参数传递给应用程序构造函数时引发PathIsNotAValidOne。

嗨,我想写一个测试来确定在给定的情况下不会引发异常。

这是默认的假设——不引发异常。

如果你什么都没说,那在每个测试中都是假设的。

你不需要为它写任何断言。

def _assertNotRaises(self, exception, obj, attr):                                                                                                                              
     try:                                                                                                                                                                       
         result = getattr(obj, attr)                                                                                                                                            
         if hasattr(result, '__call__'):                                                                                                                                        
             result()                                                                                                                                                           
     except Exception as e:                                                                                                                                                     
         if isinstance(e, exception):                                                                                                                                           
            raise AssertionError('{}.{} raises {}.'.format(obj, attr, exception)) 

如果需要接受参数,可以修改。

叫喜欢

self._assertNotRaises(IndexError, array, 'sort')

确保对象被初始化而没有任何错误的一种直接方法是测试对象的类型实例。

这里有一个例子:

p = SomeClass(param1=_param1_value)
self.assertTrue(isinstance(p, SomeClass))