2011-05-03 37 views
99

Django文檔(http://docs.djangoproject.com/en/1.3/topics/testing/#running-tests)說,你可以通過指定他們單獨運行測試用例:運行在Django特定的測試情況下,當你的應用程序有一個測試目錄

$ ./manage.py test animals.AnimalTestCase 

這是假設你有你的測試中Django應用程序中的tests.py文件。如果這是真的,那麼這個命令就像預期的那樣工作。

我有我的一個測試目錄Django應用程序測試:

my_project/apps/my_app/ 
├── __init__.py 
├── tests 
│ ├── __init__.py 
│ ├── field_tests.py 
│ ├── storage_tests.py 
├── urls.py 
├── utils.py 
└── views.py 

tests/__init__.py文件有一套()函數:

import unittest 

from my_project.apps.my_app.tests import field_tests, storage_tests 

def suite(): 
    tests_loader = unittest.TestLoader().loadTestsFromModule 
    test_suites = [] 
    test_suites.append(tests_loader(field_tests)) 
    test_suites.append(tests_loader(storage_tests)) 
    return unittest.TestSuite(test_suites) 

要運行我做了測試:

$ ./manage.py test my_app 

試圖指定單個測試用例引發異常:

$ ./manage.py test my_app.tests.storage_tests.StorageTestCase 
... 
ValueError: Test label 'my_app.tests.storage_tests.StorageTestCase' should be of the form app.TestCase or app.TestCase.test_method 

我試圖做什麼異常消息說:

$ ./manage.py test my_app.StorageTestCase 
... 
ValueError: Test label 'my_app.StorageTestCase' does not refer to a test 

如何指定單獨的測試情況下,當我的測試是在多個文件?

回答

97

結帳django-nose。它允許你指定測試一樣運行:

python manage.py test another.test:TestCase.test_method 

或在評論中指出的,使用語法:

python manage.py test another.test.TestCase.test_method 
+0

感謝@sdolan。遇到與hekevintran相同的問題。切換到Django的鼻子,它解決了這個問題,也比默認的Django測試運行器更好。 – LeeMobile 2011-05-06 15:29:37

+5

謝謝。 Django的測試運行者無法做到這一點有點蹩腳。 – hekevintran 2011-05-19 17:17:14

+0

這運行測試,但如何運行整個TestCase? – jMyles 2012-06-11 18:39:06

7

我是有這個問題,我發現這個問題,萬一別人來一起,這裏是我挖出來的。 DjangoTestSuiteRuner使用名爲build_test(label)的方法,根據標籤計算出要運行的測試用例。看着這個方法,事實證明他們正在做「模型」或「測試」模塊上的getattr()。這意味着如果你返回一個套件,那麼測試運行器不會在那個套件中尋找你的測試用例,它只會在這些模塊中的一箇中查找。

快速解決方法是使用__init__.py直接導入您的測試,而不是定義套件。使它們成爲「測試」模塊的一部分,因此build_test(標籤)可以找到它們。

對於你上面的例子,tests/__init__.py應該只包含:

from field_tests import * 
from storage_tests import * 

這是不是很優雅,當然,如果你正在試圖做更復雜的東西與你的套件,那麼這將無法工作,但它會用於這種情況。

2

將這個代碼在你的__init__。py,它會導入包和子包中的所有測試類。這將允許您運行特定的測試,而無需手動導入每個文件。

import pkgutil 
import unittest 

for loader, module_name, is_pkg in pkgutil.walk_packages(__path__): 
    module = loader.find_module(module_name).load_module(module_name) 
    for name in dir(module): 
     obj = getattr(module, name) 
     if isinstance(obj, type) and issubclass(obj, unittest.case.TestCase): 
      exec ('%s = obj' % obj.__name__) 

同樣,對於您的測試套件,你可以簡單地使用:

def suite(): 
    return unittest.TestLoader().discover("appname.tests", pattern="*.py") 

現在你有新的測試需要做的就是寫他們,並確保他們在測試文件夾中。沒有更繁瑣的進口維護!

116

由於Django 1.6可以運行完整的測試用例或單一測試,對要運行的元素使用完整的點符號。

自動測試發現現在可以在工作目錄下的任何文件中找到以測試開頭的測試,因此解決您必須重命名文件的問題,但現在可以將它們保留在您想要的目錄中。如果你想使用自定義文件名,你可以用選項標誌--pattern="my_pattern_*.py"指定一個模式(默認的Django測試運行器)。

所以,如果你在你的manage.py目錄,要運行的測試test_aTestCaseA應用下的文件tests.py內/模塊example你會怎麼做:

python manage.py test example.tests.A.test_a 

如果你不想包括一個依賴,並在Django 1.6或更高版本,這是你如何做到這一點。

See the Django documentation for more information

+0

現在很高興看到此功能內置到Django中。 – hekevintran 2014-02-24 16:11:59

4

這應該與工作

python manage.py test my_app.tests.storage_tests 
相關問題