将目录添加到 Django 搜索路径以进行测试

run*_*ace 4 python django unit-testing

我正在为各种自定义发行版使用单个 django。我找到了一个解决方案,其中每个发行版独有的应用程序都位于 django 项目文件夹之外(我们称之为DIR/),并DIR/使用如何将所有 django 应用程序保留在特定文件夹中 (添加到sys.path)将其添加到 Django 路径 之外。路径解决方案)

该项目运行,但是现在它没有发现测试。在将应用程序移出 Django 项目文件夹之前,我可以简单地运行所有测试:

manage.py test
Run Code Online (Sandbox Code Playgroud)

但是,现在没有找到测试。除了添加DIR/到 settings.py 之外,我还尝试将其添加到 manage.py 并且没有帮助。通过阅读 django 文档,我发现我可以指定一个这样的模块:

manage.py test app_name.tests
Run Code Online (Sandbox Code Playgroud)

以上工作,但对许多应用程序是不切实际的。如何添加用于搜索测试的路径?

我读了这个,但它只描述了问题,而不是解决方案: Django test runner not found tests

请求我的项目结构:

somefolder/
  |-- dist/
  |     |-- dist1/apps/
  |     |       |---- app11/
  |     |       '---- app12/
  |     |
  |     '-- dist2/apps/
  |             |---- app21/
  |             '---- app22/
  |-- src/
        |-- manage.py
        |-- project/settings.py
        |-- appA/
        '-- appB/
Run Code Online (Sandbox Code Playgroud)

由于询问已经发现这有效(不理想):

manage.py test app11 app12 app21 app22 --keepdb
Run Code Online (Sandbox Code Playgroud)

bax*_*ico 6

关键是__init__py在你的dist,dist/dist1dist/dist1/apps目录中添加一些空文件。

我只是尝试将一个具有以下结构的玩具项目放在一起:

.
??? dist
?   ??? dist1
?   ?   ??? apps
?   ?   ?   ??? app_external
?   ?   ?   ?   ??? admin.py
?   ?   ?   ?   ??? apps.py
?   ?   ?   ?   ??? __init__.py
?   ?   ?   ?   ??? migrations
?   ?   ?   ?   ?   ??? __init__.py
?   ?   ?   ?   ??? models.py
?   ?   ?   ?   ??? tests.py
?   ?   ?   ?   ??? views.py
?   ?   ?   ??? __init__.py
?   ?   ??? __init__.py
?   ??? __init__.py
??? src
    ??? app_internal
    ?   ??? admin.py
    ?   ??? apps.py
    ?   ??? __init__.py
    ?   ??? migrations
    ?   ?   ??? __init__.py
    ?   ??? models.py
    ?   ??? tests.py
    ?   ??? views.py
    ??? manage.py
    ??? project
        ??? __init__.py
        ??? settings.py
        ??? urls.py
        ??? wsgi.py
Run Code Online (Sandbox Code Playgroud)

请注意,__init__.pydist/. 这就是使每个目录成为Python 包并使 Python 测试机器在这些目录中查找测试的原因。

另请注意,我有一个名为的内部应用程序app_internal和一个app_external在与您类似的目录结构中调用的外部应用程序。

无论是app_internalapp_external有一个假的测试tests.py文件。

app_external/tests.py 内容:

from django.test import TestCase

class ExternalTestCase(TestCase):

    def test_fake(self):
        self.assertTrue(False)
Run Code Online (Sandbox Code Playgroud)

app_internal/tests.py 内容:

from django.test import TestCase

class InternalTestCase(TestCase):

    def test_fake(self):
        self.assertTrue(True)
Run Code Online (Sandbox Code Playgroud)

这里我们期望app_external测试会失败,而app_internal测试会成功。

我可以app_internal通过给出通常的命令来调用测试:

$ ./manage.py test
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)

我可以app_external通过给出以下命令来调用测试:

$ ./manage.py test ..
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
F
======================================================================
FAIL: test_fake (dist.dist1.apps.app_external.tests.ExternalTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/augusto/develop/apps_outside/dist/dist1/apps/app_external/tests.py", line 10, in test_fake
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 1 test in 0.000s

FAILED (failures=1)
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)

注意我..是如何将参数作为参数传递给测试命令的。

这指向相对于 的父目录src/,因此它会找到该dist包以及其中的所有其他包。我希望这会在您的dist/目录下找到所有测试。

我还可以通过给出以下命令同时运行所有内部和外部测试:

$ ./manage.py test . ..
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.F
======================================================================
FAIL: test_fake (dist.dist1.apps.app_external.tests.ExternalTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/home/augusto/develop/apps_outside/dist/dist1/apps/app_external/tests.py", line 10, in test_fake
    self.assertTrue(False)
AssertionError: False is not true

----------------------------------------------------------------------
Ran 2 tests in 0.001s

FAILED (failures=1)
Destroying test database for alias 'default'...
Run Code Online (Sandbox Code Playgroud)

我使用 Django 1.11.23 和 Python 2.7.12 对此进行了测试。