2011-05-30 55 views
13

在Python unittest框架中,如果未引发异常,是否有方法通过单元测试,否则将失败并返回AssertRaise?如果没有引发异常,请通过Python单元测试

+0

我只有在测试遗留代码并进行一系列完整性测试时才发现需要这样做。这些都是没有任何Asserts的测试(基本上验证代码块不会爆炸而执行)。任何意外的异常无论如何都会使测试失败 - 不确定Python框架是否与xUnit系列类似。 – Gishu 2011-06-01 05:16:54

+1

可能的重复:http://stackoverflow.com/questions/4319825/python-unittest-opposite-of-assertraises – 2014-11-13 01:53:49

回答

12

如果我正确理解你的问题,你可以做这样的事情:

def test_does_not_raise_on_valid_input(self): 
    raised = False 
    try: 
     do_something(42) 
    except: 
     raised = True 
    self.assertFalse(raised, 'Exception raised') 

...假设你有一个相应的测试正确Exception被上调无效的输入,当然:

def test_does_raise_on_invalid_input(self): 
    self.assertRaises(OutOfCheese, do_something, 43) 

然而,正如评论指出的那样,你需要考虑它是什么,你是实际上测试。这可能是一个测试像...

def test_what_is_42(self): 
    self.assertEquals(do_something(42), 'Meaning of life') 

...更好,因为它测试系统所需的行为,如果一个异常提出将失败。

+2

恕我直言,这样的事情应该是unittest.TestCase类的一部分,这是一个尴尬的事情要,但我不能是唯一想要的人。 – 2011-05-30 23:50:52

+0

@Levi Campbell:我同意,一个'assertDoesNotRaise()'方法会更简洁。 N.B:自从你接受之后,我编辑了我的答案。 – Johnsyweb 2011-05-30 23:57:20

+10

为什么要先弄个例外,然后再提出一个例外?只要调用'do_something()',并且如果引发异常,测试会自动失败。这也是'assertDoesNotRaise()'不存在的原因。 – 2011-05-31 02:16:19

9

本页面上的许多评论将错误和失败视为等同的,但事实并非如此。在我看来,正确的解决方案是在引发异常的情况下明确地通过测试。例如:

def test_does_not_error(self): 
    try: 
     code_under_test() 
    except ThatException: 
     self.fail("code_under_test raised ThatException") 
+1

同意 - 虽然控制台输出的错误和失败的解析相当于人类阅读,大多数自动化的单元测试工具对待两者是完全不同的,对吗? – hBy2Py 2015-10-08 02:17:36

-1

正如在Sven的评论中指出的那样,只需调用你的功能,例如, do_something()。如果引发未处理的异常,测试会自动失败!真的没有理由做其他事情。这也是为什么assertDoesNotRaise()不存在的原因。

+0

为什么downvote?答案非常准确。 – 2017-08-04 02:22:23

相关问题