在Django项目中,单元测试通常按应用程序组织,Django提供了一个工具来运行所有测试、单个应用程序的测试、单个测试用例或单个测试方法。
然而,我发现单个应用程序中的测试用例通常属于单独的逻辑组或集群,并且只运行一组测试通常是有用的。例如,想象一下:
- 我有几个测试用例,每个测试用例都覆盖了单个模型的不同配置,我想在开发模型时运行所有测试用例(以及仅运行它们(。(这尤其麻烦,因为最便宜的方法是将测试用例集中在一起,所以现在你有了一个可以轻松运行的测试用例,但阅读和维护起来是一场噩梦(
- 我有一系列实用程序类,它们的测试非常快速,因为它们不会访问数据库。重构模型测试和视图测试时,我不需要运行它们
我四处寻找。但是,尽管将测试拆分到多个文件中相对简单(例如,请参见这两个问题(,但似乎没有一种简单的方法可以单独运行测试组。
那么,我是不是错过了什么?小组测试的秘诀是什么?
值得一看python的nose测试框架,了解解决这个问题的一种方法。
具体来说,您可以标记测试或在测试上设置属性。然后只运行带有给定标记的测试子集(在应用程序或整个项目中(。
https://nose.readthedocs.org/en/latest/plugins/attrib.html?highlight=tags
请注意,nose扩展了unittest,所以您现有的django-unittest套件可能已经使用nose-runner运行了。
对于Django<1.6
我个人认为:
您有一个init文件:
myapp/tests/__init__.py :
from test1 import *
from test2 import *
def suite():
import unittest
#import doctest # If you want to use doctest
TEST_CASES = (
'sendim.tests.test1',
'sendim.tests.test2',
)
suite = unittest.TestSuite()
#suite.addTest(doctest.DocTestSuite(object)) # object which have doctest
for t in TEST_CASES :
suite.addTest(unittest.TestLoader().loadTestsFromModule(__import__(t, globals(), locals(), fromlist=["*"])))
return suite
例如,名为"TestCase1"的文件中的测试用例:
myapp/tests/test1.py :
from django.utils import unittest
class TestCase1(unittest.TestCase) :
# Your testcase
如果您启动./manage.py test myapp
,它将启动每个测试用例
否则,如果您启动`/manage.py测试myapp。TestCase1,它将只执行这一个。