2010-03-04 48 views
23

Django的1.4 documentation on tests狀態:Django的文檔測試在views.py

對於給定的Django應用程序,測試運行查找文檔測試在兩個地方:

  • models.py文件。您可以爲單個模型定義模塊級別的文檔測試和/或文檔測試。將模型文檔字符串和模型級文檔測試中的應用級文檔測試放入模型文檔中是很常見的做法。

  • 應用程序目錄中的名爲tests.py的文件 - 即保存models.py的目錄。這個文件是你想寫的所有文檔的鉤子,它們不一定與模型相關。

出於好奇,我想知道爲什麼Django的TestRunner的僅限於文檔測試中models.py,但更實際的,我想知道如何人能擴大的TestRunner的文檔測試包括(例如)views.py等模塊運行時manage.py test

我很感激任何輸入。

謝謝。

布賴恩

回答

22

您可以通過在tests.py中添加/編輯suite()函數來完成此操作,該函數定義django測試運行器將運行哪些測試。

import unittest 
import doctest 
from project import views 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(doctest.DocTestSuite(views)) 
    return suite 

然後,像往常一樣運行測試,你應該看到你的doctests在views.py運行。

$ python manage.py test project 

這在更詳細的django testing documentation

當你運行你的測試描述,測試工具的默認行爲是要找到所有的測試用例(即,單元測試的子類。 TestCase)在models.py和tests.py中自動構建一個測試套件,然後運行該套件。

還有第二種方法爲模塊定義測試套件:如果在models.py或tests.py中定義一個名爲suite()的函數,那麼Django測試運行器將使用該函數構造測試套件爲那個模塊。這遵循建議的單元測試組織。有關如何構建複雜測試套件的更多詳細信息,請參閱Python文檔。

但是,請記住,構建您自己的測試套件意味着django測試運行器不會自動運行tests.py中的任何測試。你必須將這些手動添加到您的套件,例如

import unittest 
import doctest 
from project import views 

class FooTestCase(unittest.TestCase): 
    def testFoo(self): 
     self.assertEquals('foo', 'bar') 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(doctest.DocTestSuite(views)) 
    suite.addTest(unittest.TestLoader().loadTestsFromTestCase(FooTestCase)) 
    return suite 
+1

謝謝!真的有用 – droope 2011-10-05 19:03:22

+3

這仍然是正確的方式,與Django 1.8?安德烈米拉斯的回答如下表明它已被更新。 – 2013-12-13 12:32:24

+3

@ BrianM.Hunt不確定1.8版本,但在1.6版本中,似乎不再調用'suite()'。安德烈用'load_tests()'的答案代替了。 – jamesc 2013-12-13 13:37:40

2

Django的原生測試系統基於unittest包。所以它並不像它那樣強大。

我建議你使用nose,它是類固醇上向後兼容的unittest。與Django test runner that uses nose一起使用。您可以通過多種方式自定義鼻子,包括使用-m標誌將其指向自定義測試位置。

7

這是我tests/__init__.py實施的基礎上,Jesse Shieh answer

import doctest 
import unittest 

list_of_doctests = [ 
    'myapp.views.myview', 
    'myapp.forms.myform', 
] 
list_of_unittests = [ 
    'sometestshere', # This file is myapp/tests/sometestshere.py 
    'moretestshere', # This file is myapp/tests/moretestshere.py 
    'myapp.tests.othertest', # Absolute paths also work. 
] 

def suite(): 
    suite = unittest.TestSuite() 
    for t in list_of_doctests: 
     suite.addTest(doctest.DocTestSuite(
      __import__(t, globals(), locals(), fromlist=["*"]) 
     )) 
    for t in list_of_unittests: 
     suite.addTest(unittest.TestLoader().loadTestsFromModule(
      __import__(t, globals(), locals(), fromlist=["*"]) 
     )) 
    return suite 

基本上,這個解決方案允許將任意的「文件」(實際上,模塊)到測試套件。它允許將單元測試分成單獨的文件,並允許添加任何包含doctests的模塊。只需將模塊名稱添加到此文件頂部的相應列表即可。

15

事情還得changed in Django 1.6

文檔測試將不再被自動發現。要將 doctests集成到您的測試套件中,請按照recommendations in the Python documentation

因此,所有我必須做我自己就是(在程序my_app/tests.py):

import unittest 
import doctest 
from my_app import views 

def load_tests(loader, tests, ignore): 
    tests.addTests(doctest.DocTestSuite(views)) 
    return tests 
+0

你把這段代碼放在哪裏? – jamesc 2013-12-13 11:54:48

+2

在我的應用程序tests.py文件的最後(我更新了我的答案)。 – 2013-12-13 12:16:46

+0

這對我工作感謝。我能夠引入應用程序的模型,而不是查看文檔測試的視圖。我想你可以跳過導入'unittest'? – jamesc 2013-12-13 13:29:57