2010-04-13 107 views
2

我正在編寫一對簡單的WSGI應用程序來感受這個標準,並且我想要測試我的應用程序是否按預期工作。現在我試圖找出啓動和停止託管這些應用程序的服務器的最佳方式。運行WSGI應用程序功能測試的最佳方法?

我首先想到的是在setUp方法來啓動從wsgirefSimpleServer和關閉它在tearDown方法。由於serve_forever區塊,我在單獨的Thread中完成了這項工作。不幸的是,如果我使用serve_forever來啓動服務器,它所在的輔助線程永遠不會死亡,並且事實證明threading沒有公開殺死Thread的方法。

現在我使用的是這樣的事情是我在run實施考慮服務器的Thread

while keep_going: 
    httpd.handle_request() 

其中keep_going是我在setUp設置爲True在我tearDown設置爲False的變量。

有沒有更好的方法?我希望只使用標準庫來編寫這些應用程序和測試,當我使用lib/framework時,我更好地理解了我正在抽象的東西 - 但這看起來像是一個非常麻煩的問題。

謝謝。

回答

3

測試WSGI應用程序的最佳方式是WebTest,它消除了爲您的應用程序生成測試服務器的需求。相反,它可以讓你做讓HTTP請求到你的WSGI應用程序作爲方法的TestApp對象調用:

>>> from webtest import TestApp 
>>> from myapp import my_wsgi_app 
>>> app = TestApp(my_wsgi_app) 
>>> res = app.get('/') 
>>> res.status 
'200 OK' 
>>> res.status_int 
200 
>>> params = {'email': '[email protected]', 'password': 'foo', } 
>>> res = app.post('/login/', params) 
>>> res.status_int 
302 

我通常有一個基礎測試類,將一個self.app屬性添加到我的測試用例指向TestApp我正在測試的WSGI應用程序的實例。所以,我的測試方法最終看起來類似:

def test_index_page(self): 
    res = self.app.get('/') 
    self.failUnlessEqual(res.status_int, 200) 
+0

根據我的經驗,在WebTest上引入一個依賴(至少用於測試)是非常值得的。祝你好運! – 2010-04-13 19:48:31

1

我不認爲SimpleServer曾經打算在一個線程中運行。在單獨的過程中開始SimpleServer可能會更好,例如,使用stdlib中的subprocess模塊。然後,您可以在setUptearDown方法中產生/終止進程。

+0

這是一個很好的點,並回答了我原來的問題相當好聽,但看它多一些之後,我想介紹關於WebTest的依賴是值得的,在這點。 – 2010-04-13 18:51:52

相關問題