如何将 django 单元测试扩展到多个文件?

  • 我有一个 python-django 应用程序
  • 我用的是 单元测试框架单元测试框架
  • 测试安排在 module 目录中的文件“ tests.py”中
  • 我正在通过 ./manage.py test app进行测试

现在。

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

怎么做到的?

48281 次浏览

Http://docs.python.org/library/unittest.html#organizing-tests 讨论了将文件分割成模块,上面的部分有一个例子。

请注意,这种方法在 Django 1.6中不再有效,请参阅 邮寄

您可以在 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 *

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

./manage.py test app.some_test_in_bananas

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

托马斯给出的答案是正确的。但是,确保 __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运行特定的测试

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

来自 Django 1.7文档

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

来自 Django 1.6文档,

测试发现基于单元测试模块的内置测试 默认情况下,这将在名为 工作目录下的「 test * . py 」。

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

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

定义模块的测试套件还有第二种方法: 如果 在 models.py 或 tests.py 中定义一个名为 suit ()的函数 Django 测试运行程序将使用该函数来构造测试套件 这个模块遵循建议的单元组织 请参阅 Python 文档以获得有关如何 构造一个复杂的测试套件。

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

如果你的 组织测试是关于 分组挑选的,而你又是 nose的粉丝,那就用 姜戈的鼻子:

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

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

附言

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

不需要在 init 中编写任何代码。 只需要在你的应用程序中创建一个子目录 比如说

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会如预期般工作。

对于 Django 2.2,一个简单且相当好的解决方案是在应用程序中创建一个 test文件夹,你可以将相关的 test_...py文件放入其中,只需将 __init__.py添加到 test文件夹中。

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

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

请参考@osa 对文件变数命名原则的回应。

在 django 中,可以使用以下命令,也可以检查 文件。此外,使用此命令将拾取不仅提供 test*.pytest_*.py 模式的文件。

文件
如果测试文件的命名与 test * 不同,可以使用-p (或—— pattern)选项指定自定义文件名模式匹配。Py 模式:

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

只需在应用程序中使用 test _ name 创建不同的测试文件

假设您有以下测试文件:

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

或者在 Windows 中,如果你不想创建一个包(即 __init__.py文件夹) ,只想创建一个名为“测试”的文件夹,并且这个文件夹包含测试文件,那么在 cmd 中运行测试,只需输入

python manage.py test your_app_name/Tests

既然有路可走