连接数据库(即使它是内存中的数据库)会降低我的测试速度(目前需要超过5分钟)。如何模拟数据库API?
所以我正在考虑嘲笑数据库API。
对于真正的数据库API,如果有任何SQL语法错误或错误的列名称,它会引发异常。
虽然对于模拟对象,我想不出有任何办法来做这种检查。
是否有可能使用模拟对象来完成此操作?
连接数据库(即使它是内存中的数据库)会降低我的测试速度(目前需要超过5分钟)。如何模拟数据库API?
所以我正在考虑嘲笑数据库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...
我假设你正在使用的mock库。
但真的--5分钟不是那长。个人喜好,但我更喜欢保持这样的依赖 - 它可以帮助你捕捉API错误。你永远不会完美地模拟出了一个API,和数据库是不是是严重的外部依赖...
如果运行单元测试需要5分钟就不会经常运行它们。单元测试永远不会太快。单元测试不是为了捕捉“API错误”。这就是集成和回归测试的目的。如果您使用外部API,并且要确保其行为与预期相同,请为其编写回归测试。这个测试可能会比单元测试慢,但你也不需要经常运行它们,因为API及其行为不会一直改变。 – EricSchaefer
嘿,只是你知道,你的最后一行有错误。 'mock_db_connection.execute = mock_execute'应该放在左侧缩进的新行中。感谢摩根 –
!我认为这是对的。 – hwjp
以同样的方式,你嘲笑其他的API :) – Ankush