如何传播Django的unit testing多个文件?

  • 我有一个python-django应用程序
  • 我正在使用unit testing框架
  • testing安排在模块目录下的“tests.py”文件中
  • 我通过./manage.py test app运行testing

现在..

  • tests.py文件变得相当大/复杂/杂乱
  • 我想将tests.py分解成更小的testing集合…

怎么样?

Django 1.6中的行为已经改变,所以不再需要创build一个包。 只要命名您的文件test*.py

从Django 1.7文档

在运行testing时,testing实用程序的默认行为是在名称以test开头的任何文件中查找所有testing用例(即unittest.TestCase的子类),自动从这些testing用例中构buildtesting套件,并运行该套件。

从Django 1.6文档 ,

testing发现基于unittest模块的内置testing发现。 默认情况下,这将在当前工作目录下的任何名为“test * .py”的文件中发现testing。

以前的行为, 从Django 1.5文档 :

在运行testing时,testing实用程序的默认行为是在models.py和tests.py中查找所有testing用例(即unittest.TestCase的子类),自动构buildtesting用例组合外的testing用例,并运行该套件。

还有第二种方法为模块定义testing套件:如果在models.py或tests.py中定义一个名为suite()的函数,那么Djangotesting运行器将使用该函数为该模块构buildtesting套件。 这遵循build议的unit testing组织。 有关如何构build复杂testing套件的更多详细信息,请参阅Python文档。

请注意,这种方法不再有效从Django 1.6,看到这个职位 。

你可以用___init___.py在里面创buildtests文件夹(这样它就成为一个包)。 然后在这里添加你的拆分testing.py文件,并将其全部导入到___init___.py

即:用一个看起来像文件一样的模块replacetest.py文件:

在相关应用程序下创build一个tests目录

应用
应用程序\ models.py
应用程序\ views.py
应用程序\testing
应用程序\testing\ __ init__.py
应用程序\testing\ bananas.py
应用程序\testing\ apples.py

将子模块导入到app\tests\__init__.py

 from bananas import * from apples import * 

现在,您可以使用./manage.py,就好像它们都在单个文件中一样:

 ./manage.py test app.some_test_in_bananas 

托马斯所说的答案是正确的。 但是,确保__init__.py中的导入与您的文件结构相匹配可能会变得冗长乏味。

自动检测文件夹中的所有testing,可以在__init__.py添加:

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

这将允许您运行./manage.py test appname但不会处理运行特定的testing。 要做到这一点,你可以使用这个代码(也在__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__) 

现在你可以通过manage.py test app或者通过manage.py test app.TestApples来运行所有的testing

如果你有更复杂的设置,或者不想使用from ... import * -type语句,你可以在你的tests.py(或者tests / __init__.py)中定义一个名为suite的函数,它返回一个实例testingunittest.TestSuite

无需在init中编写任何代码。 只需在您的应用程序中创build一个子目录。 唯一的要求是不叫它testing*例如

 app/ app/__init_.py app/serializers.py app/testing/ app/testing/__init__.py app/testing/tests_serializers.py 

只要让你的目录结构如下所示:

 myapp/ __init__.py tests/ __init__.py test_one.py test_two.py ... ... 

python manage.py test myapp将按预期工作。

我想./manage.py test只是运行所有的testing技巧(在Django> = 1.7)。

如果你的组织testing是关于分组挑剔 ,你是nose粉丝使用django鼻子 :

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

如果你知道鼻子,那么你知道如何“通配符”在所有的文件更好。

PS

这只是一个更好的做法。 希望有所帮助。 答案是从这里借用的: 当你的应用程序有一个testing目录时,在Django中运行一个特定的testing用例