Python 如何模拟数据库api?

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

连接数据库(即使是内存中的数据库)会减慢我的单元测试(目前需要5分钟以上)

所以我正在考虑模仿数据库api

对于真实的数据库api,如果出现任何SQL语法错误或列名键入错误,则会引发异常

当使用模拟对象时,我想不出任何方法来进行这种检查


可以用模拟对象来完成吗?

当然可以!您可以使用自己的自定义函数模拟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`应位于左侧缩进的新行上。