4

我有一个下载一些文件的 python 函数。

例如

def downloader():
    file_list=['fileone.htm','filetwo.htm','filethree.htm']
    for f in file_list:
        (filename,headers) = urllib.urlretrieve(f,'c:\\temp\\'+f)

对功能进行单元测试的正确方法是什么?它是否有效取决于 urlretrieve 函数的行为方式,这取决于外部因素。

4

2 回答 2

4

如果您只想测试该函数对 file_list 中的所有元素调用 urlretrieve ,则可以修改该函数以将检索函数作为参数:

def downloder(urlretrieve):
  file_list=['fileone.htm','filetwo.htm','filethree.htm']
  for f in file_list:
    (filename,headers) = urlretrieve(f,'c:\\temp\\'+f)

然后在您的单元测试中,您可以创建一个自定义函数并检查调用的次数和参数是否正确。

calls = []
def retrieve(url, local) :
  calls.append([url,local])

assert(len(calls) == 3)
assert(calls[0][0] == 'fileone.html')
assert(calls[0][2] == 'c:\\temp\\fileone.html')
...

您可以使用库Mock来简化为单元测试创​​建自己的检索函数的部分。

于 2013-07-26T10:17:49.223 回答
0

基本上,如果你需要测试你的逻辑如何响应urlretrieve函数的行为,你需要在你的程序流中注入一个模拟的行为。这样做的一种方法是将urllib功能包装在一个模块或类中,以便在运行单元测试时生成此行为。例如,如果您的下载功能在其自己的模块中,您可以执行以下操作(简化伪代码):

文件:dowloader.py

class UrllibWrapper:
    # thin wrapper for urllib

class Downloader:
    def __init__(self, urllib_class=None):
        if urllib_class is None:
            self.ul = UrllibWrapper()
        else:
            self.ul = urllib_class

    def download(self, f, dest):
        self.ul.urlretrieve(f, dest)

if __name__ == '__main__':
    class FakeUrllibWrapper:
        # implement desired behaviour of urrlib

    ul = FakeUrllibWrapper()
    dl = Downloader(ul)
    # do unit tests

在你的节目中,你会做:

# ...
from downloader import Downloader
dl = Downloader()
for f in files:
    dl.download(f, dest)
于 2013-07-26T10:08:44.750 回答