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

时间:2011-06-28 17:33:09

标签: python django unit-testing

在Django项目中,单元测试通常由app组织,Django提供运行所有测试的工具,单个应用程序的测试,单个测试用例或单个测试方法。

然而,我发现单个应用程序中的测试用例通常属于不同的逻辑组或集群,并且只能运行一组测试通常很有用。想象一下,例如:

  • 我有几个测试用例,涵盖了每个模型的不同配置,我想在开发模型时运行所有这些(并且只是它们)。 (这是特别麻烦的,因为这样做的便宜方法是将测试用例放在一起,所以现在你有一个可以轻松运行的测试用例,但这是一个阅读和维护的噩梦。)
  • 我有一系列实用程序类,它们的测试非常快,因为它们没有访问数据库。在重构这些测试时,我不需要运行模型测试和查看测试。
我在四处寻找。但是,虽然将测试分成多个文件相对简单(参见例如these two个问题),但似乎没有一种直接的方法可以单独运行测试组。

那么,我错过了什么吗?小组测试的秘诀是什么?

2 个答案:

答案 0 :(得分:2)

对于解决此问题的一种方法,值得查看python的鼻子测试框架。

具体来说,您可以标记测试或设置属性。然后只运行标记有给定标记或标记的测试子集(跨应用程序或整个项目)。

https://nose.readthedocs.org/en/latest/plugins/attrib.html?highlight=tags

请注意,鼻子扩展了unittest,因此你现有的django unittest套件可能已经与鼻跑者一起运行。

答案 1 :(得分:2)

对于Django< 1.6
Personaly我做:

您有一个 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 test myapp.TestCase1,它将只执行这个。