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

时间:2011-06-06 06:33:16

标签: django unit-testing

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

现在..

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

如何?

13 个答案:

答案 0 :(得分:114)

请注意,此方法在Django 1.6中不再有效,请参阅此post

您可以在tests内创建___init___.py文件夹(以便它成为一个包)。然后在那里添加拆分测试.py文件,并在___init___.py中导入所有文件。

I.e:用一个看起来像文件的模块替换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 *

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

./manage.py test app.some_test_in_bananas

答案 1 :(得分:39)

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

From Django 1.7 documentation

  

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

来自Django 1.6 documentation

  

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

以前的行为,from Django 1.5 documentation

  

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

     

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

答案 2 :(得分:26)

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

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

import unittest

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

这将允许您运行./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__)

现在,您可以通过manage.py test app或特定的manage.py test app.TestApples

运行所有测试

答案 3 :(得分:8)

只需制作如下目录结构:

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

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

答案 4 :(得分:5)

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

答案 5 :(得分:1)

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

答案 6 :(得分:1)

无需在init中编写任何代码。 只需在您的应用中创建一个子目录。只有不要将其称为测试* 例如

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

答案 7 :(得分:0)

我认为./manage.py test只是运行所有测试技巧(在django> = 1.7)。

如果您的组织测试是关于分组 cherrypicking ,并且您是nose使用django nose的粉丝:

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

如果你知道鼻子,那么你就知道如何在所有文件中使用“通配符”。

PS

这只是一种更好的做法。希望有所帮助。答案来自这里:Running a specific test case in Django when your app has a tests directory

答案 8 :(得分:0)

使用Django 2.2,一个简单且相当不错的解决方案是在应用程序内创建一个测试文件夹,您可以将相关的test _... py文件放入其中,只需将 init .py添加到测试文件夹。

答案 9 :(得分:0)

我有两个文件。一个是tests.py,另一个是test_api.py。我可以如下单独运行它们。

   manage.py test companies.tests
   manage.py test companies.test_api

请参阅@osa关于文件命名约定的回复。

答案 10 :(得分:0)

在 django 中你可以使用下面的命令或者可以检查 documentation。此外,使用此命令将选取具有您提供的模式的文件,而不仅仅是 test*.pytest_*.py。

<块引用>

文档
如果您的测试文件的名称与 test*.py 模式不同,您可以使用 -p(或 --pattern)选项指定自定义文件名模式匹配:

$ ./manage.py test --pattern="tests_*.py"

答案 11 :(得分:0)

只需在您的应用中使用 tests_name 创建不同的测试文件

假设您有以下测试文件:

tests_admins.py
tests_staff.py
tests_others.py
# will run both test files
(venv)..yourapp$./manage.py test --keepdb -v 2 appname

答案 12 :(得分:0)

或者在 Windows 中,如果您不想创建一个包(即带有 __init__.py 的文件夹)而只想创建一个名为“Tests”的文件夹,该文件夹包含测试文件,然后在 cmd 中运行测试只需输入

python manage.py test your_app_name/Tests

由于预期路径