为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

郎朗坤 2023-08-22 10:13:12
我创建了一个固定装置,可以从数据库中提取数据并将其放入 DataFrame 中,以便所有后续测试都可以在同一查询输出上运行。相同的代码在一个函数中上演,该函数启动我的数据处理管道(我正在围绕该管道构建所有这些测试)。我不确定是否要模拟数据库查询结果,因为我想测试查询返回的列名并记录其他内容的唯一性。我感到困惑的是如何正确测试代码中与夹具执行相同操作的函数output_data。在我的应用程序中为灯具复制代码是否正确?# df_service.pyfrom project.settings import MSSQL_DB_CON_STR as condef 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.pyimport pytestimport 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 
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

因此,您可以采用以下一种方法来解决此问题:

由于该df_from_sql()函数位于您的应用程序的范围内,因此它也应该是您真正想要测试的函数。因此,我会为该函数编写一个 pytest 测试,断言诸如Does it return X number of columnsorIs the number of rows > 0等内容(如果您不能保证每次都返回相同的数据)。

我明白为什么您想要使用该函数来创建夹具,但这会带来以下风险:

  • 由于某种原因获取数据的功能不起作用。那么你所有的测试都可能会失败,因为你的测试ouput data不是他们所期望的。

  • 数据库中的数据可能会发生变化,因此您会得到与预期不同的结果。

理论上,装置应该在空间和时间上尽可能固定,所以我建议是将所需的数据实际保存output_data在某个文件中,或者可能保存在数据库的模拟表中,以确保它永远不会改变。


查看完整回答
反对 回复 2023-08-22
  • 1 回答
  • 0 关注
  • 67 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信