使用 Try 和 Except 时如何对 Python 中的错误进行单元测试
How to Unit Test errors in Python when using Try and Except
我正在尝试对我的一个函数进行单元测试,以确保数据库连接有效,如果无效,请提出正确的 exception.I 我很难测试是否正确鉴于数据库连接 not valid
引发异常
我已经成功模拟了数据库连接,并在连接有效时得到了我想要的结果。然而,尽管测试成功,它肯定没有按预期工作。当我用特定错误模拟数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然通过。有关更多详细信息,请参阅代码。
def get_database():
try:
conn = pyodbc.connect(
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
)
return conn
# I want to assert this specific error is raised given bad connection
except pyodbc.Error as err:
raise err
@mock.patch('directory1.script1.pyodbc.connect')
def test_database_connection_error(self, mock_conn):
# If connection is valid test works as intended!
get_database()
mock_conn.assert_called_once_with((
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
))
# This test still passes even though the errors are different!
mock_conn.side_effect = pyodbc.ProgrammingError
self.assertRaises(pyodbc.Error, get_database)
我希望如果模拟数据库连接设置为一种类型的错误并且断言另一种错误,那么测试应该会失败。事实并非如此。
pyodbc.ProgrammingError
是 pyodbc.DatabaseError
的子类,pyodbc.DatabaseError
是 pyodbc.Error
的子类,所以你的:
self.assertRaises(pyodbc.Error, get_database)
只要引发 pyodbc.Error
的子类的任何异常实例,包括 pyodbc.DatabaseError
,它就会通过。
您应该具体说明要捕获 pyodbc.Error
的哪个子类。
我正在尝试对我的一个函数进行单元测试,以确保数据库连接有效,如果无效,请提出正确的 exception.I 我很难测试是否正确鉴于数据库连接 not valid
引发异常我已经成功模拟了数据库连接,并在连接有效时得到了我想要的结果。然而,尽管测试成功,它肯定没有按预期工作。当我用特定错误模拟数据库连接并断言引发了另一个错误时,即使它们是不同的错误,测试仍然通过。有关更多详细信息,请参阅代码。
def get_database():
try:
conn = pyodbc.connect(
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
)
return conn
# I want to assert this specific error is raised given bad connection
except pyodbc.Error as err:
raise err
@mock.patch('directory1.script1.pyodbc.connect')
def test_database_connection_error(self, mock_conn):
# If connection is valid test works as intended!
get_database()
mock_conn.assert_called_once_with((
r'Driver={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=M:\Path\To\Database\My_Database.accdb;'
))
# This test still passes even though the errors are different!
mock_conn.side_effect = pyodbc.ProgrammingError
self.assertRaises(pyodbc.Error, get_database)
我希望如果模拟数据库连接设置为一种类型的错误并且断言另一种错误,那么测试应该会失败。事实并非如此。
pyodbc.ProgrammingError
是 pyodbc.DatabaseError
的子类,pyodbc.DatabaseError
是 pyodbc.Error
的子类,所以你的:
self.assertRaises(pyodbc.Error, get_database)
只要引发 pyodbc.Error
的子类的任何异常实例,包括 pyodbc.DatabaseError
,它就会通过。
您应该具体说明要捕获 pyodbc.Error
的哪个子类。