簡體   English   中英

python 中的單元測試 - 我們可以在 python 中模擬 SQL 查詢結果嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM