如何在多个文件上传播django单元测试?

Joh*_*Mee 118 django unit-testing

  • 我有一个python-django应用程序
  • 我正在使用单元测试框架
  • 测试安排在模块目录中的"tests.py"文件中
  • 我正在通过测试运行 ./manage.py test app

现在..

  • tests.py文件变得相当大/复杂/凌乱
  • 我想tests.py分成更小的测试集合......

怎么样?

Tom*_*ski 118

请注意,这种方法不再适用于Django 1.6,请参阅此文章.

您可以tests使用___init___.pyinside 创建文件夹(以便它成为包).然后在那里添加拆分测试.py文件并导入所有文件___init___.py.

即:test.py使用看起来像文件一样的模块替换文件:

tests在相关应用下创建目录

app
app\models.py
app\views.py
app\tests
app\tests\__init__.py
app\tests\bananas.py
app\tests\apples.py

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

from bananas import *
from apples import *
Run Code Online (Sandbox Code Playgroud)

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

./manage.py test app.some_test_in_bananas
Run Code Online (Sandbox Code Playgroud)

  • 不再适用于Django 1.6,请访问http://stackoverflow.com/a/20932450/117194 (19认同)
  • @jMyles,如果通过"常规django测试运行器"你的意思是`python manage.py test myapp`那么实际上这个答案确实可行.(刚试了一下) (4认同)
  • @Tomasz ..你的话仍在那里 - 完整无缺.因为你把我放在了正确的轨道上,我只是把它充实了一点. (2认同)

osa*_*osa 44

Django 1.6中的行为已经改变,因此不再需要创建包.只需命名您的文件test*.py.

来自Django 1.7文档

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

Django 1.6文档,

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

以前的行为,来自Django 1.5文档:

运行测试时,测试实用程序的默认行为是在models.py和tests.py中查找所有测试用例(即unittest.TestCase的子类),从这些测试用例中自动构建测试套件,并运行该套件.

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

  • 在django 2.6中它并没有真正发现任何东西...... (4认同)
  • 目前使用Django 1.10,我想将所有`test*.py`文件放在一个名为`tests`的文件夹中以保持文件夹清洁 - 这是可能的,但你必须运行`./manage.py test app.tests`并且所有相对导入都需要上升一个级别(`from .models`变为`from ..models`). (2认同)

Bry*_*nan 26

Tomasz所说的答案是正确的.但是,确保导入__init__.py符合您的文件结构可能会变得很繁琐.

自动检测文件夹中的所有测试,您可以将其添加到__init__.py:

import unittest

def suite():   
    return unittest.TestLoader().discover("appname.tests", pattern="*.py")
Run Code Online (Sandbox Code Playgroud)

这将允许您运行./manage.py test appname但不会处理运行特定测试.为此,您可以使用此代码(也在__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__)
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过manage.py test app或通过特定的测试运行所有测试manage.py test app.TestApples


spi*_*ama 11

只需使您的目录结构如下:

myapp/
    __init__.py
    tests/
        __init__.py
        test_one.py
        test_two.py
        ...
    ...
Run Code Online (Sandbox Code Playgroud)

python manage.py test myapp将正常工作.


Jim*_*lle 5

http://docs.python.org/library/unittest.html#organizing-tests谈到将文件拆分为模块,正上方的部分有一个例子.

  • 我正在寻找的'额外''超过rtfm,是测试的django设置环境,数据库和固定装置. (2认同)