2009-12-31 159 views
14

我正在編寫一個封裝了某個Web服務API的Python模塊。這是所有REST,實現起來相對簡單。使用SimpleHTTPServer進行單元測試

但是,在單元測試中我發現了一個問題:因爲我沒有運行我爲此模塊創建的服務,所以我不想錘擊它們,但同時我需要檢索數據來運行我的測試。我看着SimpleHTTPServer,這將是確定的。

我解決了部分問題,但現在,因爲我似乎無法終止線程,所以在啓動測試應用程序時,我多次遇到「地址已在使用中」的問題。

下面是一些示例代碼

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) 

其中「index.json」是我做了一個模擬的JSON文件,它替代了真實的東西。程序終止後,我如何優雅地清理事物?

+0

SimpleHTTPServer應該是最簡單的方法。你有什麼樣的問題? – balpha 2009-12-31 12:24:59

+0

我重寫了一些東西,我希望現在更清楚。 – Einar 2009-12-31 12:53:20

回答

11

嘗試使用subclass of TCPServer with allow_reuse_address set True

class TestServer(SocketServer.TCPServer): 
    allow_reuse_address = True 

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

輝煌!不錯,簡單 – Claudiu 2013-03-05 02:25:07

+0

這對我來說不起作用,但我能夠通過在setUpClass方法而不是setUp方法中設置SocketServer來解決這個問題。使用中的地址錯誤似乎在第二次調用setUp方法時發生(這發生在第二次測試運行時)。 – mlissner 2013-06-14 20:05:56

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 2009-12-31 13:27:14

4

舊線程,但答案在這裏沒有幫助我,我用的HttpServer,每個單元測試後關閉(默認的httpserver具有allow_reuse_address = 1套)。但是在調用關機之後,我仍然得到了已經使用的地址問題。我固定使用:

from BaseHTTPServer import HTTPServer 

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

不確定爲什麼這種情況在默認情況下不會發生?可能這不是最優?