似乎“manage.py test”每次运行测试时都会创建测试数据库。有没有办法阻止每次我运行测试时创建测试数据库,但只是截断数据(刷新)?Django单元测试无需每次运行时创建测试数据库
我的表格几乎大约有40张桌子(即使是单个应用程序,而不是整个项目),并且每次运行测试时都会让我感到恶心。
似乎“manage.py test”每次运行测试时都会创建测试数据库。有没有办法阻止每次我运行测试时创建测试数据库,但只是截断数据(刷新)?Django单元测试无需每次运行时创建测试数据库
我的表格几乎大约有40张桌子(即使是单个应用程序,而不是整个项目),并且每次运行测试时都会让我感到恶心。
根据您的需求,你有几个选择:
你可以写一个自定义的测试运行或调整默认的一个:https://docs.djangoproject.com/en/1.6/topics/testing/advanced/#other-testing-frameworks
你可以使用SimpleTestCase
有也是附加组件,如django-test-utils(尽管我不确定这个特定的版本是否适用于现代的Django版本)。
或者,要加快速度,您可以使用SQLite's in-memory database或创建您的test database in RAM disk (like tmpfs or ramfs) - 事实上,这与使用其他技术是正交的。
Django的鼻子支持重用数据库:
https://github.com/django-nose/django-nose#enabling-database-reuse
但是,请务必阅读评论:
的一个新的皱纹的是,只要你的数据库架构更改,你在下次运行测试时应该离开标志。这将提示 测试运行器重新初始化测试数据库。
而且,REUSE_DB不与离开 垃圾在DB TransactionTestCases兼容的,所以一定要使您TransactionTestCases卫生 (见下文),如果你想使用它。
如果有更多的南迁移次数,以下解决方案也将减少数据库创建时间。在单元测试期间,运行syncdb而不是运行所有南迁移将会快得多。
SOUTH_TESTS_MIGRATE =假#要禁用迁移和使用执行syncdb 代替
我猜这是我作为一个解决方法做了不最佳实践,但事情是创建一些不同的测试程序在管理/命令目录内的应用程序。
https://docs.djangoproject.com/en/1.7/howto/custom-management-commands/
例如,我工作的一个应用程序,现在需要一些先进的Postgres的功能(不能使用SQLite),这样,而不是创建测试功能tests.py的一部分,我创建test_process.py在myapp/management/commands/
从Django 1.8开始,您可以在调用manage时使用--keepdb标志。PY
新在Django 1.8:您可以防止测试数据库被 通过增加--keepdb标志到测试命令进行销毁。这将在运行之间保存测试数据库。如果数据库不存在 ,它将首先被创建。任何迁移也将应用 为了保持它的最新状态。 (https://docs.djangoproject.com/en/1.8/topics/testing/overview/#the-test-database)
所以,您的通话可能看起来如下:
python manage.py test --keepdb
或者使用速记-k它可能看起来像:
python manage.py test -k
您可能希望有pytest
作为测试赛跑者。配置示例如下。
样品pytest.ini
文件:
[pytest]
norecursedirs=
*.egg
.git
.tox
.env
_sass
build
dist
migrations
fabfile
.tox
python_files =
test_*.py
tests.py
DJANGO_SETTINGS_MODULE=settings.dev
addopts=
--reuse-db
--nomigrations
--cov=your_app
--ignore=.tox
--ignore=fabfile
--ignore=scripts
--ignore=settings
--ignore=tmp
--cov-report=html
--cov-report=term
--cov-report=annotate
样品runtests.py
文件:
#!/usr/bin/env python
import os
import sys
import pytest
def main():
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings.dev")
return pytest.main()
if __name__ == '__main__':
sys.exit(main())
样品requirements.txt
文件:
pytest==3.0.2
pytest-django==2.9.1
pytest-cov==2.2.1
运行测试:
./runtests.py
请注意,该效果是通过reuse-db
和nomigrations
指令实现的。
对于使用默认测试工具包的现代Django(1.8或更高版本) - 这是最简单的。 –
即使使用keepdb,django也会坚持每次运行迁移 – Matt
@Matt _如果测试数据库 不存在,它将在第一次运行时创建,然后为每个 后续运行保留。在运行测试套件之前,任何未应用的迁移也将应用于测试 数据库._ [django-docs](https://docs.djangoproject.com/en/1.11/ref/django-admin/#cmdoption-test- keepdb) – Kim