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

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

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

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

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

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

当前回答

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

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

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

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

其他回答

我是最初的海报,我接受了DGH的上述答案,而没有首先在代码中使用它。

一旦我使用了它,我意识到它需要做一些调整才能真正做到我需要它做的事情(公平地说,他/她确实说了“或类似的东西!”)。

为了其他人的利益,我认为有必要在这里发布这个调整:

    try:
        a = Application("abcdef", "")
    except pySourceAidExceptions.PathIsNotAValidOne:
        pass
    except:
        self.assertTrue(False)

我在这里试图做的是确保如果尝试实例化一个应用程序对象,使用第二个空间参数pySourceAidExceptions。PathIsNotAValidOne将被引发。

我相信使用上面的代码(主要基于DGH的回答)可以做到这一点。

我发现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))

你可以试试。 试一试: 自我。assertRaises(没有,函数,__arg1、最长) 除了: 通过 如果你不把代码放在try块中,它会通过异常“AssertionError: None not raised”,测试用例将失败。如果将测试用例放入try块中,则测试用例将通过,这是预期的行为。

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

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

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

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

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

这里有一个例子:

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