2009-12-31 6 views
14

특정 웹 서비스 API를 감싸는 파이썬 모듈을 작성하고 있습니다. 모든 REST이므로 구현하기가 상대적으로 간단합니다.단위 테스트를 위해 SimpleHTTPServer 사용하기

그러나 단위 테스트와 관련하여 문제가 발생했습니다. 모듈을 만든 서비스를 실행하지 않기 때문에 망치질을 원하지 않지만 동시에 검색해야합니다. 내 테스트를 실행할 데이터. 나는 SimpleHTTPServer를 보았는데 괜찮을 것이다.

문제의 일부를 해결했지만 지금은 스레드를 종료 할 수 없으므로 테스트 응용 프로그램을 두 번 이상 실행할 때 "주소가 이미 사용 중입니다"라는 문제가 발생합니다.

는 여기에 몇 가지 예제 코드 "index.json는"진짜를 대체 내가 만든 모의 JSON 파일이

PORT = 8001 

handler = SimpleHTTPServer.SimpleHTTPRequestHandler 

httpd = SocketServer.TCPServer(("", PORT), handler) 

httpd_thread = threading.Thread(target=httpd.serve_forever) 
httpd_thread.setDaemon(True) 
httpd_thread.start() 

api_data = urllib.urlopen("http://localhost:8001/post/index.json") 
print "Data start:" 
print json.load(api_data) 

입니다. 프로그램을 종료 한 후 어떻게하면 정상적으로 정리할 수 있습니까?

+0

SimpleHTTPServer가 가장 쉬운 방법입니다. 어떤 종류의 문제가 있습니까? – balpha

+0

나는 사물의 말을 바꿨다. – Einar

답변

11

subclass of TCPServer with allow_reuse_address set True 사용해보십시오 :

class TestServer(SocketServer.TCPServer): 
    allow_reuse_address = True 

... 
httpd = TestServer(("", PORT), handler) 
+0

화려한! nice and simple – Claudiu

+0

이것은 나에게 효과가 없지만 setUp 메서드 대신 setUpClass 메서드에서 SocketServer를 설정하여이 문제를 해결할 수있었습니다. 주소 사용 오류는 setUp 메서드가 두 번째 호출 될 때 발생합니다 (두 번째 테스트가 실행될 때 발생 함). – mlissner

4

wsgiref에 구축 된 서버를 사용합니다. http://docs.python.org/library/wsgiref.html

단위 테스트를 추가 할 때이 서버에 기능을 추가하는 것은 매우 쉽습니다.

subprocess으로 서버를 시작합니다. http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

우리는 이러한 종류의 테스트에 스레드를 사용하지 않습니다. 왜? (1) 단위 테스트 서버는 다소 복잡하며 클라이언트 응용 프로그램과 완벽하게 격리되어 있습니다. (2) 클라이언트 응용 프로그램은 별도의 하드웨어에서 별도의 프로세스가되므로 우리는 해당 구성에 대해 실제 성능 기대치를 확보해야합니다. (3) 더 간단합니다. (4) 모든 플랫폼에서 이식 가능합니다. (5) 이미 실행중인 프로덕션 같은 서버로 독립형 장치 테스트에서 통합 테스트로 변경하는 것은 간단합니다.

실제로 로그가 제대로 종료되도록 합리적으로 제어되는 방식으로 서버를 종료하는 작은 WSGI 응용 프로그램이 있습니다.

+0

사실, 하위 프로세스가 좋은 대안이 될 것 같습니다. 더 조사 할 것이다. – Einar

4

올드 스레드를하지만 대답은 여기, 내가 HTTP 서버 사용하고 나에게 도움이되지 않았다 및 기본 HTTP 서버에 의해 (각 단위 테스트 후 종료하면 allow_reuse_address = 1 개 세트가). 그러나 나는 아직도 shutdown을 호출 한 후 주소를 사용중에있다. 다음을 사용하여 수정했습니다 :

from BaseHTTPServer import HTTPServer 

class MyHTTPServer(HTTPServer): 
    def shutdown(self): 
     self.socket.close() 
     HTTPServer.shutdown(self) 

이것이 왜 기본적으로 발생하지 않는지 확실하지 않습니까? 이것이 최적이 아닌가?

관련 문제