python - python 中的单元测试——我们可以在 python 中模拟 SQL 查询结果吗?
问题描述
摘要:我有一个我想测试的方法。这种方法涉及连接数据库,提取结果(从 sql 查询)并将其保存到数据框中。
我想知道,有没有一种方法可以模拟从 SQL 查询中检索到的结果?
我尝试了 unittest 库,创建了一个类似于从 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”做了几个动作,我的议程是模拟这个对象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
因此,简单的解决方案是模拟任何调用链 fromsqlite3
和 mockpd.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']}
推荐阅读
- sql - 计算特定值/特征之间有多少行
- excel - 使用可能的 With 语句将范围内的可见单元格转换为合并单元格。Excel VBA
- python - 在python中将字符串图像转换为真实图像
- fonts - 在 ltk 中设置字体
- r - 字符串拆分、合并和堆叠多列
- visual-studio - Msbuild 将二进制文件输出到另一个平台
- python-3.x - 在python中创建气泡图
- python-3.x - 如何在kivy中从.kv文件获取滑块值到python文件
- c# - 在 C# 中,MongoDB 映射 DateTime 出错了
- java - Android : setBackground 方法改变 View 的高度