如何在Django中以比应用程序更高的粒度对单元测试进行分组



在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,它将只执行这一个。

最新更新