2013-07-26 3 views
2

나는 몇 개의 파일을 다운로드하는 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 함수가 작동하는 방식에 따라 다릅니다.

+1

메소드가 * * * 다운로드를 수행합니까? 그렇지 않으면, 여기서 정말로 시험하고 싶은 것은 무엇입니까? 기본적으로 다운로드가 성공했다고 가정 할 때 테스트 할 내용은 무엇입니까? 실패하면 어떻게 될까요? 그걸 처리 할 논리가 있습니까? 테스트 할 내용이 있습니까? –

+0

전체 메서드는 URL 및 대상 파일 이름을 생성합니다. 그런 다음 다운로드를 반복합니다. 나는 단위 테스트에 상당히 익숙하며, 따라서 정확하게 일을 올바르게 수행하는 법을 배우려하고 있습니다. – Ginger

답변

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 

당신의 progam에서 당신이 할 것 다운로드 기능은 자신의 모듈에있는 경우 예를 들어,이 같은 (간체 의사 코드)를 할 수있다 :

# ... 
from downloader import Downloader 
dl = Downloader() 
for f in files: 
    dl.download(f, dest) 
2

테스트 할 모든이 기능을 사용하면 매개 변수로 검색하는 기능을하는 기능을 수정할 수 있습니다 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를 사용할 수 있습니다.

관련 문제