如何解决使用全局变量作为参数调用方法的 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
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 举报,一经查实,本站将立刻删除。