如何启动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
- 使用Selenium WebDriver读取JavaScriptvariables
- Android Studio中的Android Instrumentationtesting和unit testing之间的区别?
- 敏捷方式:整合testing与functiontesting还是两者兼而有之?
- 如何在python中使用selenium webdriver滚动网页?
- 如何做websockets负载testing
- UNIX的“时间”命令对于基准testing是否足够准确?
- 事实之后,Pro和Con的unit testing
- sbt中的ScalaTest:有没有一种方法可以在没有标签的情况下运行单个testing?
- 确定一个函数是否存在于bash中