【问题标题】:Fail Test Case if Exception is Raised and Handled in Python?如果在 Python 中引发和处理异常,则测试用例失败?
【发布时间】:2026-01-07 11:00:01
【问题描述】:

看看下面的测试用例:

def test_1_check_version(self):
    try:
        self.version()
        print('\n')
    except cx_Oracle.DatabaseError as error_message:
        print("Sorry Connection could not be established because "+str(error_message))

上面是我在Python的Unittest中写的很多测试用例的测试用例,现在我运行它来检查数据库的连接是否连接。

如果是,那么它将传递“数据库版本号”。

如果不是,那么它会抛出一个异常,我已经处理了。

运行这个休息用例后,测试用例显示在我使用过的任何测试框架(Robot、unittest、pytest)中都通过了。

但是,我希望这个测试用例失败,因为它不是我想要的结果。

处理异常,因为我想看到唯一的错误消息,而不是所有那些红线异常。

我愿意接受任何建议,无论是否涉及删除异常。

【问题讨论】:

    标签: python unit-testing automated-tests python-unittest


    【解决方案1】:

    通过测试的行为是预期的。只有当您收到某些断言中未预期的结果时,测试才会失败。

    在你的情况下,如果你想抛出异常,你应该使用:

    self.assertRaises(cx_Oracle.DatabaseError, self.version())
    

    如果要检查版本是否正确,请使用:

    self.assertEqual(XXX, self.version())
    

    其中 XXX 是您期望的 self.version() 的值

    【讨论】:

    • 我通过方法获取值,可以在assertEqual中处理吗?
    • 当然!想象一下,您有一个返回 1 的 foo() 方法。通过执行 self.assertEqual(1, foo()),您将通过测试。如果您期望得到“2”,self.assertEqual(2, foo()) 将失败
    【解决方案2】:

    从 2.7 版开始:添加了使用 assertRaises() 作为上下文管理器的功能

    所以推荐的用法是

    with self.assertRaises(SomeException) as cm:
        self.version()
    
    the_exception = cm.exception
    self.assertEqual(the_exception.error_code, 3)
    

    see document

    【讨论】:

      最近更新 更多