如何启动django可重用应用程序的testing?

我可以启动我的可重复使用的Django应用程序的testing,而无需将此应用程序合并到项目中?

我的应用程序使用一些模型,所以有必要提供(TEST_)DATABASE_*设置。 我应该在哪里存储它们?我应该如何启动testing?

对于Django项目,我可以使用manage.py test运行testing; 当我用独立的应用程序使用django-admin.py test时,我得到:

错误:无法导入设置,因为环境variablesDJANGO_SETTINGS_MODULE未定义。

这里最好的做法是什么?

Django(> = 1.4)testing运行器的正确用法如下:

 import django, sys from django.conf import settings settings.configure(DEBUG=True, DATABASES={ 'default': { 'ENGINE': 'django.db.backends.sqlite3', } }, ROOT_URLCONF='myapp.urls', INSTALLED_APPS=('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.admin', 'myapp',)) try: # Django <= 1.8 from django.test.simple import DjangoTestSuiteRunner test_runner = DjangoTestSuiteRunner(verbosity=1) except ImportError: # Django >= 1.8 django.setup() from django.test.runner import DiscoverRunner test_runner = DiscoverRunner(verbosity=1) failures = test_runner.run_tests(['myapp']) if failures: sys.exit(failures) 

DjangoTestSuiteRunner和DiscoverRunner具有大部分兼容的接口。

有关更多信息,请参阅“定义testing运行程序”文档:

  • DjangoTestSuiteRunner (Django> = 1.4,<1.8)
  • DiscoverRunner (Django> = 1.8)

我已经结束了这样的解决scheme(这是从django投票中find的解决scheme的启发):

创build文件,例如。 testing目录中的'runtests.py'包含:

 import os, sys from django.conf import settings DIRNAME = os.path.dirname(__file__) settings.configure(DEBUG = True, DATABASE_ENGINE = 'sqlite3', DATABASE_NAME = os.path.join(DIRNAME, 'database.db'), INSTALLED_APPS = ('django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.admin', 'myapp', 'myapp.tests',)) from django.test.simple import run_tests failures = run_tests(['myapp',], verbosity=1) if failures: sys.exit(failures) 

它允许通过python runtests.py命令运行testing。 它不需要安装依赖项(例如buildout),并且不会损害在应用程序被合并到更大的项目中时运行的testing。

对于Django 1.7来说略有不同。 假设你有以下应用程序foo目录结构:

 foo |── docs |── foo │ ├── __init__.py │ ├── models.py │ ├── urls.py │ └── views.py └── tests ├── foo_models │ ├── __init__.py │ ├── ... │ └── tests.py ├── foo_views │ ├── __init__.py │ ├── ... │ └── tests.py ├── runtests.py └── urls.py 

这是Django项目本身如何构build它的testing。

你想用下面的命令在foo/tests/运行所有的testing:

 python3 runtests.py 

你也希望能够从父目录的tests运行命令,例如通过Tox或Invoke,就像python3 foo/tests/runtests.py

我在这里提出的解决scheme是相当可重用的,只有应用程序的名称foo必须调整(如果需要,还可以添加其他应用程序)。 他们不能通过modify_settings安装,因为它会错过数据库设置。

需要以下文件:

urls.py

 """ This urlconf exists because Django expects ROOT_URLCONF to exist. URLs should be added within the test folders, and use TestCase.urls to set them. This helps the tests remain isolated. """ urlpatterns = [] 

runtests.py

 #!/usr/bin/env python3 import glob import os import sys import django from django.conf import settings from django.core.management import execute_from_command_line BASE_DIR = os.path.abspath(os.path.dirname(__file__)) sys.path.append(os.path.abspath(os.path.join(BASE_DIR, '..'))) # Unfortunately, apps can not be installed via ``modify_settings`` # decorator, because it would miss the database setup. CUSTOM_INSTALLED_APPS = ( 'foo', 'django.contrib.admin', ) ALWAYS_INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ) ALWAYS_MIDDLEWARE_CLASSES = ( 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) settings.configure( SECRET_KEY="django_tests_secret_key", DEBUG=False, TEMPLATE_DEBUG=False, ALLOWED_HOSTS=[], INSTALLED_APPS=ALWAYS_INSTALLED_APPS + CUSTOM_INSTALLED_APPS, MIDDLEWARE_CLASSES=ALWAYS_MIDDLEWARE_CLASSES, ROOT_URLCONF='tests.urls', DATABASES={ 'default': { 'ENGINE': 'django.db.backends.sqlite3', } }, LANGUAGE_CODE='en-us', TIME_ZONE='UTC', USE_I18N=True, USE_L10N=True, USE_TZ=True, STATIC_URL='/static/', # Use a fast hasher to speed up tests. PASSWORD_HASHERS=( 'django.contrib.auth.hashers.MD5PasswordHasher', ), FIXTURE_DIRS=glob.glob(BASE_DIR + '/' + '*/fixtures/') ) django.setup() args = [sys.argv[0], 'test'] # Current module (``tests``) and its submodules. test_cases = '.' # Allow accessing test options from the command line. offset = 1 try: sys.argv[1] except IndexError: pass else: option = sys.argv[1].startswith('-') if not option: test_cases = sys.argv[1] offset = 2 args.append(test_cases) # ``verbosity`` can be overwritten from command line. args.append('--verbosity=2') args.extend(sys.argv[offset:]) execute_from_command_line(args) 

一些设置是可选的; 他们提高速度或更现实的环境。

第二个参数指向当前目录。 它利用提供目录path的function来发现该目录下的testing 。

对于我的可重用的应用程序( Django的调节 )我使用buildout。 我创buildexample_project ,我用它build立运行testing。 我只是把我的应用程序放在example_project的设置里面。

当我想安装我的项目所使用的所有依赖项并运行testing时,我只需要执行以下操作:

  • 运行:python bootstrap.py
  • 运行构build:

    斌/扩build

  • 运行Django 1.1和Django 1.2的testing:

    bin / test-1.1 bin / test-1.2

在这里你可以find教程如何configuration可重用的应用程序使用构build部署和testing运行: http : //jacobian.org/writing/django-apps-with-buildout/

在这里你会发现我在我的项目中使用的buildoutconfiguration示例:

http://github.com/dominno/django-moderation/blob/master//buildout.cfg