連接數據庫(即使它是內存中的數據庫)會降低我的測試速度(目前需要超過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