关于单元测试:如果未引发异常,则传递Python单元测试

Pass a Python unittest if an exception isn't raised

在python unittest框架中,如果没有引发异常,是否有一种方法可以通过单元测试,否则会因断言引发而失败?


本页上的许多评论都将错误和失败视为等效的,而事实并非如此。在我看来,正确的解决方案是,如果出现异常,那么就显式地不通过测试。例如。:

1
2
3
4
5
def test_does_not_error(self):
    try:
        code_under_test()
    except ThatException:
        self.fail("code_under_test raised ThatException")


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

1
2
3
4
5
6
7
def test_does_not_raise_on_valid_input(self):
    raised = False
    try:
        do_something(42)
    except:
        raised = True
    self.assertFalse(raised, 'Exception raised')

…假设您有一个相应的测试,正确的Exception在无效输入上被引发,当然:

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

然而,正如评论中指出的,您需要考虑实际测试的是什么。很可能是像…

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

…更好,因为它测试系统所需的行为,如果出现异常,它将失败。


正如sven在评论中所指出的,只需调用您的功能,例如do_something()。如果出现未处理的异常,测试将自动失败!真的没有理由做其他的事情。这也是assertDoesNotRaise()不存在的原因。