2011-11-25 23 views
4

我的Django應用程序從另一個應用程序的HTML中剪切並導入數據。我測試了每個解析函數,並且想要測試將通過其他應用程序的爬蟲。在此之後,我想進行一些集成測試。爲了使測試儘可能地容易運行,我想通過創建一個小型的Web應用程序來模擬導入的Web應用程序,該應用程序服務於一些硬編碼的HTML,並具有我將要經歷的所有路徑。你將如何模擬Python中的Web應用程序(用於測試Django項目)

編輯另外,我的模擬必須有一些小的動態行爲 - 例如,測試失敗和成功的登錄。所以我不能只提供靜態文件。

你會如何創建這樣一個模擬應用程序?你會繼承BaseHTTPServer嗎? CGI?使用一些框架(如使用Quixote的斜紋)?或者將是合理的使用Django的呢?這是我正在認真使用的解決方案,但對於這樣的問題,Django似乎太複雜了; OTOH,另一個框架對於這樣的小需求將會是一個太重的依賴,並且BaseHTTPServer太難以使用。

第二編輯:我對嘲笑類,請求等不感興趣。這不是我想要使用的方法,並且使用這種方法的建議不是對我的回答(雖然我很感激向善良的人們建議我直到現在)。如果想想我的問題太難了,請忘記我談到了測試 - 如何粗略地模擬使用Python 的網絡應用程序

+0

只要看看http://seleniumhq.org/。硒用於各種組織中的現代瀏覽器應用程序測試。 –

+0

@GagandeepSingh這不是我正在尋找的。我不需要模擬瀏覽器,而是模擬服務器端應用程序。 – brandizzi

+0

我知道這一點,但是如果你沒有考慮到這個方向,你想給出可能可用的選項。不過,記住Web應用程序測試的解決方案是一件好事。 –

回答

0

我試圖按照@Gagandeep Singh解決方案。這似乎是最好的,並且在其他情況下可能是一個很好的解決方案,但它對我並不適用。

問題是我在另一個Django應用程序的測試目錄中有一個Django應用程序。當我用manage.py test myapp運行我的應用程序的測試時,使用的settings.py是整個項目中的一個,而不是我的嘲笑應用程序的文件。我是starting Django through the management API和使用multiprocessing,所以我敢打賭,我的問題的一部分來自這樣一個複雜的互動。也許我可以解決它,但我只是決定採取另一種策略。

我決定覆蓋BaseHTTPServer並得到一些可接受的結果。這不是一件容易的事情,但我成功地開始了我的嘲笑應用程序。

1

我會下載參考頁面wget -r(遞歸下載),然後將下載的頁面作爲靜態頁面與Apache,Nginx或任何您用作Web服務器的頁面一起提供。

除非你需要看到從Web應用程序的動態變化...

+0

我幾乎不會使用Apache或Nginx,因爲這些服務器需要太多的配置 - 我只想簽出我的項目並立即運行測試。 OTOH,我可以通過Python的['SimpleHTTPServer'](http://docs.python.org/library/simplehttpserver.html)服務器靜態HTML。問題是,在我的模擬中需要一個非常非常小的動態行爲(例如,用於測試失敗和成功登錄)的情況下有幾個小例子。如果沒有這種情況,我會很高興地使用你的方法......無論如何,你的回答顯示我的問題並不清楚。謝謝! – brandizzi

+2

使用wget -r獲取頁面,然後設置另一個Django項目以將所有下載的文件作爲靜態文件提供(Django使用起來很簡單,而且您也可以使用Django的經驗)。 –

2

我認爲你在錯誤的水平嘲諷。即使您專門爲測試運行,您的單元測試也不必依賴於外部網絡服務器。你應該用一個只返回預置數據的對象(或者你正在使用的那個進行實際的HTTP調用)替換urllib2.Request對象,包括對無效登錄的相關響應。

+0

隨便稱之爲「集成測試」:) – brandizzi

0

聽起來像你需要使用python mock。這允許你爲例如patch一個現有的命令(這可能是調用一個外部URL)並添加你自己的測試數據。

對於測試,我覺得你永遠不應該打外部服務。您應該在自己的夾具內提供您期望從該服務獲得的數據,並測試您的響應處理程序是否正在完成其工作。

相關問題