2009-12-31 37 views
14

Tôi đang viết một mô-đun Python kết thúc tốt đẹp một API dịch vụ web nhất định. Đó là tất cả REST, vì vậy tương đối đơn giản để thực hiện.Sử dụng SimpleHTTPServer để kiểm tra đơn vị

Tuy nhiên, tôi đã tìm thấy sự cố khi kiểm tra đơn vị: vì tôi không chạy các dịch vụ mà tôi đã tạo mô-đun này, tôi không muốn đóng chúng, nhưng đồng thời, tôi cần truy xuất dữ liệu để chạy thử nghiệm của tôi. Tôi đã xem xét SimpleHTTPServer, điều này sẽ ổn thôi.

Tôi đã giải quyết một phần vấn đề mà tôi có, nhưng bây giờ, vì tôi dường như không thể chấm dứt chuỗi, tôi gặp vấn đề với "địa chỉ đã được sử dụng" khi khởi chạy ứng dụng thử nghiệm nhiều lần.

Dưới đây là một số mẫu mã

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) 

đâu "index.json" là một tập tin JSON mock tôi làm mà thay thế thật. Làm thế nào tôi có thể làm sạch mọi thứ một cách duyên dáng sau khi chương trình chấm dứt?

+0

SimpleHTTPServer thực sự phải là cách dễ nhất. Bạn đang gặp phải vấn đề gì? – balpha

+0

Tôi viết lại những thứ, tôi hy vọng nó rõ ràng hơn bây giờ. – Einar

Trả lời

11

Hãy thử sử dụng một subclass of TCPServer with allow_reuse_address set True:

class TestServer(SocketServer.TCPServer): 
    allow_reuse_address = True 

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

rực rỡ! đẹp và đơn giản – Claudiu

+0

Điều này không hiệu quả đối với tôi, nhưng tôi đã có thể giải quyết vấn đề này bằng cách thiết lập SocketServer theo phương thức setUpClass thay vì phương thức setUp. Lỗi địa chỉ sử dụng dường như xảy ra lần thứ hai phương thức setUp được gọi (xảy ra khi thử nghiệm thứ hai được chạy). – mlissner

4

Chúng tôi sử dụng máy chủ được xây dựng trên wsgiref. http://docs.python.org/library/wsgiref.html

Thật dễ dàng để thêm các tính năng vào máy chủ này khi chúng tôi thêm các kiểm tra đơn vị.

Chúng tôi khởi động máy chủ với subprocess. http://docs.python.org/library/subprocess.html?highlight=subprocess#module-subprocess

Chúng tôi không sử dụng đề tài cho loại thử nghiệm này. Tại sao? (1) Máy chủ thử nghiệm đơn vị của chúng tôi khá phức tạp và chúng tôi muốn giữ nó hoàn toàn bị cô lập khỏi các ứng dụng của khách hàng. (2) Các ứng dụng khách của chúng tôi sẽ là các quy trình riêng biệt trên phần cứng riêng biệt, chúng tôi cần đảm bảo rằng chúng tôi có những kỳ vọng hiệu suất thực tế cho cấu hình đó. (3) Nó đơn giản hơn. (4) Nó di động trên tất cả các nền tảng. (5) Nó tầm thường để thay đổi từ thử nghiệm đơn vị độc lập sang thử nghiệm tích hợp với một máy chủ giống như sản xuất đang chạy.

Chúng tôi thực sự có một ứng dụng WSGI nhỏ làm cho máy chủ tắt máy theo cách được kiểm soát hợp lý để các nhật ký được tắt đúng cách.

+0

Thật vậy, có vẻ như quá trình con có thể là một lựa chọn tốt. Sẽ điều tra thêm. – Einar

4

Cũ chủ đề nhưng các câu trả lời ở đây không giúp tôi, tôi đang sử dụng HTTPServer, và tắt sau mỗi bài kiểm tra đơn vị (theo mặc định HTTPServer có allow_reuse_address = 1 bộ). Tuy nhiên tôi vẫn có địa chỉ đã được sử dụng vấn đề sau khi gọi tắt máy. Tôi đã sửa lỗi bằng cách sử dụng:

from BaseHTTPServer import HTTPServer 

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

Bạn không chắc chắn tại sao điều này không xảy ra theo mặc định? Có thể đây không phải là tối ưu?