【问题标题】:Unit testing in python - Can we mock an SQL query result in python?python 中的单元测试——我们可以在 python 中模拟 SQL 查询结果吗?
【发布时间】:2020-07-07 21:26:32
【问题描述】:

总结:我有一个我想测试的方法。该方法包括连接数据库、提取结果(从 sql 查询中)并将其保存到数据框中。

我想知道,有没有办法模拟从 SQL 查询中检索到的结果?

我尝试了 unittest 库,创建了一个类似于从 SQl 查询中收到的数据框。但我无法弄清楚如何在测试时将此变量传递给方法。

请分享您的见解。 My method is something like :

    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 新手。

【问题讨论】:

  • 您好,到目前为止您尝试过什么代码?

标签: python unit-testing python-unittest.mock


【解决方案1】:

让我们建议要测试的代码是

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']}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2010-10-25
    • 2018-04-19
    • 2014-01-29
    • 1970-01-01
    • 2014-11-13
    • 1970-01-01
    相关资源
    最近更新 更多