2009-06-18 183 views
4

我想編寫一個直接執行HTTP請求(而不是使用django.test.client.Client)的單元測試。從Django測試中訪問Django testserver

如果您好奇的原因 - 這是因爲我想測試從我的Django應用程序公開的Thrift-over-HTTP API - 我想在單元測試中使用Thrift客戶端。

問題是在測試期間,服務器實際上並未運行。當使用django.test.client.Client時,它將簡單地調用視圖函數而不是實際發出HTTP請求。 (請糾正我,如果我錯了。)

那麼強制測試框架啓動HTTP服務器的最佳方法是什麼?

我試着寫一個bash腳本,它是這樣的:

./manage.py testserver --addrport 7000 & 
PID=$! 
sleep 5 
./manage.py test --no-input 
kill $PID 

但這是凌亂的(並沒有真正的工作),因爲1)我需要睡眠(否則測試開始前,數據庫由測試服務器初始化); 2)測試將嘗試再次初始化數據庫(在測試服務器已經初始化之後)。

任何其他解決方案?

謝謝。

回答

7

是啊,你說得對 - 這是一個問題,還有是它的一個錯誤:http://code.djangoproject.com/ticket/2879

只是,那麼你可能會遇到多線程的問題,有意中省略:http://code.djangoproject.com/ticket/10117http://code.djangoproject.com/ticket/4513http://code.djangoproject.com/ticket/3357

我很沮喪,因此我寫了一個庫,包括在單獨的線程中啓動實時服務器並在之後進行清理:http://devel.almad.net/trac/django-sane-testing/。它還通過運行時monkeypatching啓動Django的多線程服務器,您可以使用cherrypy http(反正更好)。

唯一的問題是它需要你使用鼻子作爲測試框架(100%向後兼容標準unittest,但如果你已經使用其他東西...)。然後你可以使用--with-django和--with-djangoliveserver/- with-cherrypyliveserver。不知道它將如何與節儉合作。

只是要注意:

  • 請不要錯誤的Django開發者與bug報告,你對你自己的
  • 風車提供同樣的解決方案,因此,如果您正在使用的風車,你可能有口衝突
+0

感謝您的好的答案!聽起來像是對我來說過分殺傷了。我想我現在就去簡單的方法。這將是:寫一個正常的測試(不是Django - 所以它不會混淆數據庫),它連接到測試服務器,應該事先啓動。在測試setUp中,如果連接失敗,請顯示一條好消息,如「請啓動您的Django測試服務器」。 :) – ibz 2009-06-18 14:48:05