微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用全局变量作为参数调用方法的 pytest 测试方法

如何解决使用全局变量作为参数调用方法的 pytest 测试方法

我正在尝试测试 src_data_csv() 函数,但由于我在其中调用了所有这些不同的函数,因此我不确定测试它的最佳方法是什么。

def src_data_csv() -> pd.DataFrame:
    """
    Reads csv file on s3 for specific columns into pandas df.
    :return: df with the dstatuschangeddate and sgroupid columns
    """
    # csv
    namespaces_csv = list_all_namespace_prefixes(get_prefix_src_data("oe","csv"))
    file_paths = list_all_s3_files(namespaces_csv)
    # get the data from all files in the list and append it to one file
    csv_df = pd.DataFrame()
    for file_path in file_paths:
        output_file = bucket_uri(file_path)
        csv_df = csv_df.append(
            pd.read_csv(
                output_file,usecols=["name","date"],parse_dates= ["date"]
            )
        )
    return csv_df

我可以做到这一点的一种方法是对 list_all_namespace_prefixes

使用 pytest 补丁
mocker.patch("lhp_report.utilities.list_all_namespace_prefixes",return_value="src_data/extract/oncoemr/order_charge_history/")

也适用于list_all_s3_files()

mocker.patch("lhp_report.utilities.list_all_s3_files",return_value="src_data/extract/oncoemr/order_charge_history/src_data/extract/oncoemr/order_charge_history/order_charge_history_securemock_oncoemr.csv.gz")

最终用于 bucket_uri() 但由于我修补了每个函数,它会覆盖以前的函数调用,因此它似乎不是最好的方法

另一种方法是更改​​ src_data_csv(),这样我就不会在其中调用其他函数,而是将这些值作为参数传入。这也是一个繁琐的过程。

这些选项似乎都不是一个好选择,所以我想知道 monkeypatching 是否是一个好选择?我以前从未进行过测试,所以结果证明这是非常具有挑战性的。

也许我可以修补 list_all_namespace_prefixes 以便它可以使用结果调用 list_all_s3_files() 然后monkeypatch list_all_contents() 因为它在其参数中使用全局变量

作为参考,这是 list_all_s3_files() 函数

    """
    Returns a list of the file names/keys under a given S3 bucket and prefix.
    """
    result = []
    for path in src_path:
        file_names = list_all_contents(prefix=path,format="Contents")
        result.extend(file_names)
    return result

这里是 list_all_contents() ,仅供参考,我想做猴子补丁,所以我可以将它的参数指定给我的夹具 boto3 客户端。 list_all_contents() 因为这个函数使用了全局变量

def list_all_contents(
    prefix: str,format: str,bucket_name: str = BUCKET_NAME,s3_client: "boto3.client" = s3_client,) -> list:
    """
    :param prefix: path for the s3 object where all the files are located
    :param format: Contents will get all keys/files and CommonPrefixes will get all namespaces in a given prefix
    :return: List object of file namespaces/keys under a given S3 bucket and prefix.
    """

    s3_result = s3_client.list_objects_v2(
        Bucket=bucket_name,Prefix=prefix,Delimiter="/"
    )

    file_list = []
    # Contents returns Metadata about each object

    for key in s3_result.get(format,[]):
        if format == "Contents":
            file_list.append(key["Key"])
        else:
            file_list.append(key["Prefix"])

    return file_list

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?