先說需求:一、測試django項目;二、打印測試報告(html格式)
有如下幾種測試方法:
一、django自帶的測試模塊。在app目錄下的tests.py文件中寫測試類,相似這樣:html
class MyTest(TestCase):
def setUp(self):
dosomething()python
def test_case1(self):
self.assertEqual(1, 1)數據庫
def test_case2(self):
passdjango
而後直接在項目目錄下運行python manager.py test。理想狀態下,控制檯會打印出assert失敗的case。可是沒有辦法把結果輸出成html格式(也可能有我不知道的黑科技,google不到)。多線程
二、nose + django-nose + nose-htmloutput。python下比較著名的測試框架nose,加上插件nose-htmloutput,能夠把測試報告以html格式輸出,再用django的nose插件(django-nose)把nose集成到django中。使用姿式:
django項目的setting.py:app
INSTALLED_APPS = [
...
'django_nose'
]框架
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'測試
項目依賴:
pip install nose
pip install django-nose
pip install nose-htmloutput
測試命令:python manager.py test --with-html --html-file=/path/to/htmlfile。
到此爲止能夠知足大部分需求,然而因爲我項目的特殊性(詳見http://www.cnblogs.com/beeler/p/6743171.html),這種測試方式出問題了。首先說特殊性,簡單來講,就是個人項目中會出現多線程訪問數據庫的場景,若是使用TestCase,主線程對數據庫作的修改並不能從其餘線程中訪問到,爲解決這個問題,必須使用 TransactionTestCase + 非內存數據庫 的方法進行測試;其次說問題,在上述的設置下,使用django_nose.NoseTestSuiteRunner會出現錯誤,大意是文件數據庫沒法建立(目測是個nose的bug,可是錯誤比較底層,能力所限,沒能解決)。爲解決這個問題,看了一下django-nose的源碼,發現了不止NoseTestSuiteRunner這一個runner,因而試了一下另外的runner:BaseRunner和BasicNoseRunner。BaseRunner能夠運行但不能輸出html報告,BasicNoseRunner和NoseTestSuiteRunner同樣的錯誤。ui
三、直接用nose測試django項目。不用python manager.py test命令,而用nosetests加載tests.py進行測試。測試須要django環境,因此在tests.py開頭加上:
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myproject.settings")google
import django
django.setup()
運行命令 nosetests --with-html --html-file=/path/to/htmlfile