如何在Python中使用Internet依赖性进行TDD?

wn9m85ua  于 2023-04-10  发布在  Python
关注(0)|答案(1)|浏览(105)

我需要确保我有一个函数,可以从链接列表下载zip文件**,并将文件写入“zip_files/”文件夹。
我依赖于外部网页的链接和zip文件!

Since you:
- shouldn't mock
- don't rely on outside dependencies
- want to have confidence your code works!

我觉得我需要一个测试,以显示我有一个工作的功能,下载一个zip文件。

**为什么需要这个函数?**我的python脚本会返回一个JSON文件,里面有两个列表(年份,年级)。获取数据的过程如下:

1.转到网页
1.使用“class=zip_download”获取所有标签的列表
1.下载名单上的所有zip文件
1.解压缩文件并将Excel文件移动到“excel_files/”(需要备份Excel文件以备后用!)
1.在每个Excel上运行计算以提取所需的JSON
我一直在为第三(3.)步编写测试,感觉我的思想与实现耦合得太紧了。

def test_after_download_have_more_zip_files_than_links_in_list(self):
        """
        GIVEN: I provide a list of links
        WHEN: Downloading is finished
        THEN: My folder has at least as many zip files as the list items
        """

        zip_download_folder = "zip_files"
        list_of_zip_links = load_json_data(zip_link_file)

        download_zip_links(list_of_zip_links, zip_download_folder)

        self.assertGreater(len(os.listdir(zip_download_folder)), list_of_zip_links)
        for file in os.listdir(zip_download_folder):
            self.assertEqual(file.endswith('.zip'))

如何在这里编写有用的测试?

nkkqxpd9

nkkqxpd91#

在我看来,你的帖子展示了TDD的一个缺点--测试的优先级可能意味着减少了对围绕相关实现细节使用的最佳抽象的考虑。
例如,您已经定义了以下两个步骤/抽象:
1.下载名单上的所有zip文件
1.解压缩文件并将Excel文件移动到“excel_files/”
但是这个特定的实现有些随意,现在您担心的是如何TDD实现细节,以及API调用和磁盘IO等副作用。
我的建议是,这些实现细节(可能)对你来说并不重要,所以不要测试它们。这里有一个单独的抽象列表,我认为你会发现它们更容易测试,也可以解决你的用例:

def zipurls_at(target_url, css: "*")
    # your impl here
    return zipurls 

def parse_excel(excel_fobj):
    # your impl here
    return data

def compute_json(data):
    # your impl here
    return json_data

例如:

from smart_open import open

def script_core(webpage_url):
    excel_zip_urls = zipurls_at(webpage_url, css: ".zip_download")

    def output_json(excel_fobj):
       return compute_json(parse_excel(excel_fobj))

    return [output_json(open(s3_uri)) for uri in excel_zip_urls]

上面提到的方法都不关心文件是否存储到磁盘上。甚至可以在不改变测试的情况下实现100%存储在内存中。但是,如果你真的想存储到磁盘上,你可以很容易地用一个函数来实现,该函数接受一个文件对象,将其保存到某个位置,并返回保存它的路径。

相关问题