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 を呼び出すことだけをテストしたい場合は、関数を変更して、retrieve-function をパラメーターとして受け取ることができます。

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これを行う 1 つの方法は、単体テストの実行時にこの動作を生成するモジュールまたはクラスに機能をラップすることです。たとえば、ダウンロード機能が独自のモジュールにある場合、次のようなことができます (単純化された疑似コード)。

ファイル: 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 に答える