2009-09-02 3 views
0

내 테스트의 주어진 뷰가 외부 URL을 올바르게 가져 오는지 확인하고 싶습니다. 그것은 urllib2를 사용합니다 (그러나 이것은 블랙 박스 테스트이므로 중요하지 않습니다). 어떤 종류의 임시 로컬 서버일까요? 이미 이것을하는 앱이 있습니까? (내 인터넷 검색이 실패했습니다.)외부 URL 가져 오기를 테스트하기 위해 django.test.client에 해당하는 서버는 무엇입니까?

+0

내가 제안 된 접근 방법에 대한 자세한 내용을 제공하기 위해 내 대답을 업데이트했습니다. –

답변

2

SimpleHTTPServer을 사용하여 테스트를 위해 가짜 웹 서버를 조작 할 수 있습니다.

우리는 WSGI 참조 구현 인 wsgiref을 사용하여 가짜 웹 서버를 테스트합니다. wsgiref는 확장 가능한 모의 웹 서버를 만드는 매우 깨끗한 방법이기 때문에 wsgiref를 좋아합니다. 또한 웹 사이트의 관점에서 모든 것이 올바르게 수행되었는지 확인하는 데 사용되는 상태 및 종료 WSGI 응용 프로그램이 있습니다.

+0

일반적으로 모의 접근 방식보다이 방법을 권장합니다. 약간의 철학적 질문이지만 "블랙 박스"테스트를 원한다고 말하면서 특히 urllib2를 조롱하면 테스트의 내부 구현과 밀접한 관련이 있습니다. –

+0

실제로 이것은 블랙 박스 테스트에 필요한 것 같습니다. (나는 어쨌든 TDD를하고있다. 그래서 이것은 더 소리가 난다.) wsgiref는 요청의 간단한 검증을 위해 매우 편리하게 보인다. 감사! –

3

아마도 테스트중인 모듈이 urllib2를 가져올 것입니다. 테스트 하네스의 모듈을 자신의 가짜 urllib2를 가리 키도록 원숭이 패치 할 수 있습니다 (예 : 모듈 일 필요는 없습니다). 올바른 URL이 호출되는지 확인하는 urlopen 메소드가있는 클래스 인스턴스 일 수 있습니다. 적절한 응답을 반환합니다.

업데이트 : 다음은 접근법의 골격입니다. 테스트중인 모듈이 mymodule이라고 가정 해 봅시다. 테스트 모듈 (또는 별도의 유틸리티 모듈), 당신은 할 수 : 다음

import urllib2 # the real urllib2 

class Urllib2Simulator: # This is a sort of Mock 
    #In practice, you could supply additional parameters to this to tell it 
    #how to behave when e.g. urlopen is classed 
    def __init__(self): 
     self.urls_opened = [] 

    def urlopen(self, url, data=None): # this method simulates urlopen 
     self.urls_opened.append((url, data)) # remember what was opened 
     #Now, you can either delegate to the real urllib2 (simplest) 
     #Or completely simulate what it does (that's more work) 
     #Let's keep it simple for this answer. 
     #Our class instance will be acting a bit like a proxy. 
     return urllib2.urlopen(url, data) 

    #similarly define any other urllib2 functions that mymodule calls 

과, 테스트 코드 :

class MyModuleTest(unittest.TestCase): 

    def test_url_retrieval(self): # use whatever name is best 
     real_urllib2 = mymodule.urllib2 #remember it so we can restore it 
     simulator = Urllib2Simulator() 
     mymodule.urllib2 = simulator # the monkey-patch is here 
     # here, invoke your mymodule functionality which is supposed to 
     # retrieve URLs using urllib2.urlopen 
     mymodule.do_something_which_fetches_urls() 
     #restore the previous binding to urllib2 
     mymodule.urllib2 = real_urllib2 # restored - back to normal 
     #Now, check that simulator.urls_opened contains the correct values 

좀 성공이 기술을 사용했습니다. (시간이지나 가기를 시뮬레이션 할 때 특히 유용합니다.) 단위 테스트 시나리오에서는 실제 서버를 설정하는 것보다 작업이 적습니다. 통합 테스트를 위해 아마도 Lott의 대답에서 알 수 있듯이 실제 서버를 사용할 것입니다. 그러나이 방법을 사용하면 전체 서버 기반 테스트 프레임 워크를 사용하지 않고도 다양한 조건을 쉽게 시뮬레이션 할 수 있습니다 (예 : 서버가 특정 오류를 반환하도록 설정하여 코드에서 처리하는 방법을 테스트하거나 구성 가능 응답 시간 지연, 시간 초과 또는 잘못된 응답 등을 테스트 할 수 있습니다.)

+0

어떻게하면 urllib2를 장착 할 수 있습니까? 보기가 urllib2를 가져 오는 경우 테스트 코드로 가져 오기를 다른 패키지로 리디렉션 할 수 있습니까? –

+0

매우 근사합니다. 나는 이와 같은 "원숭이 패치"모듈을 연구 해 본 적이 없다. S.Lott의 apporoach는 필자의 블랙 박스 테스트 요구 사항에 더 적합 해 보이지만 나중에 참조 할 때이를 염두에 두겠습니다. 감사! –

+0

블랙 박스 테스트 관점에서 동의합니다. 시간의 흐름을 시뮬레이션 할 때 내 기술이 가장 유용하다는 것을 알았습니다. 다른 방법으로는 더 어려워졌습니다. –

0

외부 URL을 테스트 할 때 나는 vcrpy (PyPI)의 엄청난 팬입니다. HTTP 상호 작용을 파일에 기록하고 나중에 테스트를 실행할 때 다시 재생할 수 있습니다. 그것을 사용하는 가장 쉬운 방법은 테스트 함수의 데코레이터이며 카세트 (기록 된 요청/응답)는 기본적으로 YAML에 있으며 쉽게 편집 할 수 있습니다. 읽어보기에서 :

VCR.py는 HTTP 요청을하는 테스트를 단순화하고 속도를 높입니다. 처음 VCR.py 컨텍스트 관리자 또는 데코 레이팅 된 함수 내에있는 코드를 실행하면 VCR.py는 지원하는 라이브러리를 통해 자리를 차지하는 모든 HTTP 상호 작용을 기록하고 을 플랫 파일에 기록합니다 (yaml 형식). 이 플랫 파일은 카세트라고합니다. 관련 코드가 다시 실행되면 VCR.py 은 앞서 설명한 카세트 파일 에서 직렬화 된 요청 및 응답을 읽고 원래 테스트 실행에서 이 인식하는 모든 HTTP 요청을 가로 채고 이 응답 한 응답을 반환합니다 그 요청들.(또한 문서에서)

예 :

@vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml') 
def test_iana(): 
    response = urllib2.urlopen('http://www.iana.org/domains/reserved').read() 
    assert 'Example domains' in response 
관련 문제