Python 如何模拟数据库api?
连接数据库(即使是内存中的数据库)会减慢我的单元测试(目前需要5分钟以上) 所以我正在考虑模仿数据库api 对于真实的数据库api,如果出现任何SQL语法错误或列名键入错误,则会引发异常 当使用模拟对象时,我想不出任何方法来进行这种检查Python 如何模拟数据库api?,python,database,mocking,tdd,Python,Database,Mocking,Tdd,连接数据库(即使是内存中的数据库)会减慢我的单元测试(目前需要5分钟以上) 所以我正在考虑模仿数据库api 对于真实的数据库api,如果出现任何SQL语法错误或列名键入错误,则会引发异常 当使用模拟对象时,我想不出任何方法来进行这种检查 可以用模拟对象来完成吗?当然可以!您可以使用自己的自定义函数模拟db api函数,这些函数的行为方式符合您的要求: from sqlite3.dbapi2 import DatabaseError mock_db_connection = Mock() de
可以用模拟对象来完成吗?当然可以!您可以使用自己的自定义函数模拟db api函数,这些函数的行为方式符合您的要求:
from sqlite3.dbapi2 import DatabaseError
mock_db_connection = Mock()
def mock_execute(query, params):
if query == 'select firstname, lastname from student':
return [('jim', 'brown')]
elif query == 'select; firstname':
raise DatabaseError('You have an error in your SQL syntax')
mock_db_connection.execute = mock_execute
# from this point, if you've patched out your db connection with the mock,
# you can make tests against connection.execute...
我假设你在用图书馆
但实际上,5分钟没那么长。个人偏好,但我更喜欢这样保持依赖关系-它可以帮助您捕获api错误。你永远不会完美地模拟出一个API,而且数据库也没有那么严重的外部依赖性…就像模拟其他API一样:)如果运行单元测试需要5分钟,你就不会经常运行它们。单元测试永远不会太快。单元测试不是为了捕捉“api错误”。这就是集成和回归测试的目的。如果您使用外部API,并且希望确保其行为符合预期,请为其编写回归测试。此测试可能比单元测试慢,但您也不需要经常运行它们,因为API及其行为不会一直更改。嘿,正如您所知,您的最后一行有一个错误。”mock_db_connection.execute=mock_execute`应位于左侧缩进的新行上。