2011-08-25 304 views
15

似乎“manage.py test”每次运行测试时都会创建测试数据库。有没有办法阻止每次我运行测试时创建测试数据库,但只是截断数据(刷新)?Django单元测试无需每次运行时创建测试数据库

我的表格几乎大约有40张桌子(即使是单个应用程序,而不是整个项目),并且每次运行测试时都会让我感到恶心。

回答

8

根据您的需求,你有几个选择:

1

Django的鼻子支持重用数据库:

https://github.com/django-nose/django-nose#enabling-database-reuse

但是,请务必阅读评论:

的一个新的皱纹的是,只要你的数据库架构更改,你在下次运行测试时应该离开标志。这将提示 测试运行器重新初始化测试数据库。

而且,REUSE_DB不与离开 垃圾在DB TransactionTestCases兼容的,所以一定要使您TransactionTestCases卫生 (见下文),如果你想使用它。

1

如果有更多的南迁移次数,以下解决方案也将减少数据库创建时间。在单元测试期间,运行syncdb而不是运行所有南迁移将会快得多。

SOUTH_TESTS_MIGRATE =假#要禁用迁移和使用执行syncdb 代替

0

我猜这是我作为一个解决方法做了不最佳实践,但事情是创建一些不同的测试程序在管理/命令目录内的应用程序。

https://docs.djangoproject.com/en/1.7/howto/custom-management-commands/

例如,我工作的一个应用程序,现在需要一些先进的Postgres的功能(不能使用SQLite),这样,而不是创建测试功能tests.py的一部分,我创建test_process.py在myapp/management/commands/

17

从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 
+0

对于使用默认测试工具包的现代Django(1.8或更高版本) - 这是最简单的。 –

+0

即使使用keepdb,django也会坚持每次运行迁移 – Matt

+0

@Matt _如果测试数据库 不存在,它将在第一次运行时创建,然后为每个 后续运行保留。在运行测试套件之前,任何未应用的迁移也将应用于测试 数据库._ [django-docs](https://docs.djangoproject.com/en/1.11/ref/django-admin/#cmdoption-test- keepdb) – Kim

0

您可能希望有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-dbnomigrations指令实现的。