每次运行时都不会创建测试数据库的Django单元测试

时间:2011-08-25 21:55:21

标签: django unit-testing

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

我的桌子差不多大约有40张桌子(即使是单个应用程序,也不是整个项目),每次进行测试都会让我生病。

8 个答案:

答案 0 :(得分:25)

从Django 1.8开始,在调用manage.py

时可以使用--keepdb标志
  

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

答案 1 :(得分:9)

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

答案 2 :(得分:1)

django-nose支持重用数据库:

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

但是,请务必阅读评论:

  

一个新的问题是,每当您的数据库架构发生变化时,您就会发现   应该在下次运行测试时关闭标志。这将提示   测试运行器重新初始化测试数据库。

     

此外,REUSE_DB与离开的TransactionTestCases不兼容   数据库中的垃圾,所以一定要使您的TransactionTestCases卫生   (如下所示)如果你想使用它。

答案 3 :(得分:1)

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

  

SOUTH_TESTS_MIGRATE = False#禁用迁移并使用syncdb   代替

答案 4 :(得分:0)

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

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

例如,我正在开发一个需要一些高级Postgres功能的应用程序(不能使用Sqlite),所以我没有在tests.py中创建测试函数,而是在myapp / management / commands /中创建了test_process.py

答案 5 :(得分: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指令实现的。

答案 6 :(得分:0)

您也许可以尝试使用test runner

示例:

首先,创建test_runners.py

from django.test.runner import DiscoverRunner


class NoDbTestRunner(DiscoverRunner):

    def setup_databases(self, **kwargs):
        """ Override the database creation defined in parent class """
        pass

    def teardown_databases(self, old_config, **kwargs):
        """ Override the database teardown defined in parent class """
        pass

然后在settings.py中声明高于跑步者

TEST_RUNNER = 'api.tests.test_runners.NoDbTestRunner'

答案 7 :(得分:0)

当前Django版本具有--keepdb参数,您可以将其传递给测试,以免数据库在每次运行时被破坏和重建。

https://docs.djangoproject.com/en/3.0/ref/django-admin/#cmdoption-test-keepdb