在我的Django项目下有几个应用程序,它们都有单元测试。我现在正在工作的其中一个应该只包含在dev/stage环境中,所以我使用环境变量来启用它。
当这个变量存在时,它会被添加到INSTALLED_APPS中,并且运行良好,问题是Django正在执行这个应用程序的测试,即使它不在INSTALLED_APPS中也是如此,它失败了,并显示以下消息:
ImportError:无法导入测试模块:debug.tests.unit.testrongervices`
(回溯信息)。。。
RuntimeError:模型类debug.models.Email没有声明显式app_label,也不在INSTALLED_APPS中的应用程序中。
当我在该应用程序中的模型的class Meta
中定义app_label
时,错误是不同的,它说它找不到表,我认为这是因为该应用程序不在INSTALLED_APPS中,所以它的迁移没有执行。
OperationalError:没有这样的表:debug_email
我不知道Django为什么对所有应用程序执行测试,但不是迁移。
Django配置中是否遗漏了一些测试内容?
您需要返回load_tests
中发现的测试。
因此,加上@DaveLawrence的答案,完整的代码是:
# your_dev_app/__init__.py
from django.apps import apps
from os.path import dirname, abspath
def load_tests(loader, tests, pattern):
"""
loads tests for your_dev_app if it is installed.
"""
from django.conf import settings
if apps.is_installed("your_dev_app"):
return loader.discover(start_dir=dirname(abspath(__file__)), pattern=pattern)
https://docs.python.org/3/library/unittest.html#unittest.TestLoader.discover说:
如果load_tests存在,则发现不会重复出现在包中,load_testes负责加载包中的所有测试。
所以在你的应用程序中最低的__init__.py
中,你并不总是想运行:
from django.apps import apps
def load_tests(loader, tests, pattern):
from django.conf import settings
if apps.is_installed("your_dev_app"):
# Actually load the tests - thanks to @barney-szabolcs
return loader.discover(start_dir=dirname(abspath(__file__)), pattern=pattern)
运行时:
python manage.py test
该命令将按默认递归查找工作目录中具有模式CCD_ 5的所有文件。在settings.py
中不受INSTALLED_APPS
的影响。
你可以指定一个特定的应用程序来测试它:
python manage.py test app_label
或指定路径:
python manage.py test myapp/tests
如果要排除某些测试,可以对它们进行标记并使用选项--exclude-tag
。
运行python manage.py test --help
以获取有关所有选项的信息。
官方文档提供了许多关于如何运行测试的不同可能性的信息。
编辑:
如果您的应用程序只在开发环境中需要,而在生产环境中不需要,那么您可以拆分settings.py
。一种可能的解决方案是将所有开发设置外包到文件local_settings.py
中,并将其从版本控制或生产分支中排除,即不要将其推送到生产环境中。
local_settings.py
DEBUG = True
INSTALLED_APPS += (
# Django Debug Toolbar would be for example
# used only in development
'debug_toolbar',
'your dev app',
)
settings.py
try:
from .local_settings import *
except ImportError:
pass