猿问

如何使用用于播种模块作用域固定装置的相同代码正确地对函数进行 pytest

我创建了一个固定装置,可以从数据库中提取数据并将其放入 DataFrame 中,以便所有后续测试都可以在同一查询输出上运行。相同的代码在一个函数中上演,该函数启动我的数据处理管道(我正在围绕该管道构建所有这些测试)。我不确定是否要模拟数据库查询结果,因为我想测试查询返回的列名并记录其他内容的唯一性。


我感到困惑的是如何正确测试代码中与夹具执行相同操作的函数output_data。在我的应用程序中为灯具复制代码是否正确?


# df_service.py

from project.settings import MSSQL_DB_CON_STR as con


def df_from_sql(start_date, months):     

    sql = f"SELECT * FROM dbo.awesome_table_value_function('{start_date}', {months})"    

    return pd.read_sql(sql=sql, con=con)    

这是我在认识到我正在为我实际上想要测试并用作夹具的功能创建夹具之前开始使用的夹具。


# test_df_service.py


import pytest

import pandas as pd


@pytest.fixture(scope="module")

def output_data():

    from project.settings import MSSQL_DB_CON_STR as con


    start_date = "11/1/2019"

    months = 4

    sql = f"SELECT * FROM dbo.awesome_table_value_function('{start_date}', {months})"    

    return pd.read_sql(sql=sql, con=con)   


    return pd.read_sql(sql=sql, con=con)


def test_columns(output_data):

    expected_columns = ['entity','attribute','value','effective_date']

    df = output_data

    for col in df.columns:

        assert col in expected_columns 


郎朗坤
浏览 68回答 1
1回答

Qyouu

因此,您可以采用以下一种方法来解决此问题:由于该df_from_sql()函数位于您的应用程序的范围内,因此它也应该是您真正想要测试的函数。因此,我会为该函数编写一个 pytest 测试,断言诸如Does it return X number of columnsorIs the number of rows > 0等内容(如果您不能保证每次都返回相同的数据)。我明白为什么您想要使用该函数来创建夹具,但这会带来以下风险:由于某种原因获取数据的功能不起作用。那么你所有的测试都可能会失败,因为你的测试ouput data不是他们所期望的。数据库中的数据可能会发生变化,因此您会得到与预期不同的结果。理论上,装置应该在空间和时间上尽可能固定,所以我建议是将所需的数据实际保存output_data在某个文件中,或者可能保存在数据库的模拟表中,以确保它永远不会改变。
随时随地看视频慕课网APP

相关分类

Python
我要回答