![](/img/trans.png)
[英]How do I mock a "with connect" SQL query in a Python 3 unit testing?
[英]Unit testing in python - Can we mock an SQL query result in python?
摘要:我有一個我想測試的方法。 該方法包括連接數據庫、提取結果(來自 sql 查詢)並將其保存到數據框中。
我想知道,有沒有一種方法可以模擬從 SQL 查詢中檢索到的結果?
我嘗試了 unittest 庫,創建了一個 dataframe ,就像從 SQl 查詢中收到的一樣。 但我無法弄清楚如何在測試時將此變量傳遞給方法。
請分享您的見解。 我的方法是這樣的:
try:
db_connect = sqlite3.connect("address_zip.db")
db_cur = db_connect.cursor()
db_cur.execute(""" Select STD_ADDRESS,STD_CITY,STD_STATE from address""")
sql_result=pd.read_sql_query(""" Select STD_ADDRESS,STD_CITY,STD_STATE from address""",db_connect)
df = pd.DataFrame(sql_result, columns=['STD_ADDRESS', 'STD_CITY', 'STD_STATE'])
print(f"The data from database is :\n {df}")
db_cur.close()
db_connect.close()
except Exception as e:
print(f"DB exception: {e}")
return df
在原始代碼中對變量“df”進行了幾項操作,我的議程是模擬這個 object df 。
但我無法理解如何? 抱歉,這可能是一個非常基本的問題,我是 python 的新手。
讓我們建議要測試的代碼是
code_to_test.py
import sqlite3
import pandas as pd
def function_to_tets():
df = None
try:
db_connect = sqlite3.connect("address_zip.db")
db_cur = db_connect.cursor()
db_cur.execute(""" Select STD_ADDRESS,STD_CITY,STD_STATE from address""")
sql_result = pd.read_sql_query(""" Select STD_ADDRESS,STD_CITY,STD_STATE from address""", db_connect)
df = pd.DataFrame(sql_result, columns=['STD_ADDRESS', 'STD_CITY', 'STD_STATE'])
print(f"The data from database is :\n {df}")
db_cur.close()
db_connect.close()
except Exception as e:
print(f"DB exception: {e}")
return df
因此,簡單的解決方案是模擬來自sqlite3
的任何調用鏈並模擬pd.read_sql_query
的返回值
tests/test_sql.py
from code_to_test import function_to_tets
from unittest import mock
import pandas as pd
@mock.patch('code_to_test.sqlite3')
@mock.patch('code_to_test.pd.read_sql_query')
def test_sql_query(read_sql_query_mock, sqlite_mock):
read_sql_query_mock.return_value = pd.DataFrame({'STD_ADDRESS': ['address 1'],
'STD_CITY': ['city 1'],
'STD_STATE': ['state 1']})
assert function_to_tets().to_dict(orient='list') == {'STD_ADDRESS': ['address 1'],
'STD_CITY': ['city 1'],
'STD_STATE': ['state 1']}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.