Pythonunit testing – 与assertRaises相反?

我想写一个testing来确定在特定情况下不会引发exception。

testing是否引发exception很简单

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

…但你怎么能做到相反

像这样的事情,我后来…

 sValidPath=AlwaysSuppliesAValidPath() self.assertNotRaises(PathIsNotAValidOne, MyObject, sValidPath) 
 try: myFunc() except ExceptionType: self.fail("myFunc() raised ExceptionType unexpectedly!") 

只需调用该函数。 如果引发exception,则unit testing框架会将其标记为错误。 您可能想添加评论,例如:

 sValidPath=AlwaysSuppliesAValidPath() # Check PathIsNotAValidOne not thrown MyObject(sValidPath) 

嗨 – 我想写一个testing,以确定一个例外是不是在一个特定的情况下提出的。

这是默认的假设 – exception不会引发。

如果你什么都不说,那么每一个testing都是假设的。

你不必为此写下任何断言。

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

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

我认为这是为了别人的利益而发布在这里的调整:

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

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

我相信使用上面的代码(很大程度上基于DGH的答案)将会这样做。

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

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

这使您可以在代码中testing错误情况。

在这种情况下,您正在testing将无效parameter passing给应用程序构造函数时引发的PathIsNotAValidOne

我发现它是有用的猴子补丁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 

这在testing没有例外时澄清了意图:

 self.assertMayRaise(None, does_not_raise) 

这也简化了循环中的testing,我经常发现自己在这样做:

 # 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))