似乎“manage.py test”每次运行测试时都会创建测试数据库。有没有办法阻止每次运行测试时创建测试数据库,但只是截断数据(刷新)?
我的桌子差不多大约有40张桌子(即使是单个应用程序,也不是整个项目),每次进行测试都会让我生病。
答案 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)
根据您的需要,您有几个选择:
您可以编写自定义测试运行器或调整默认测试运行器: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) - 实际上这与使用其他技术正交。
答案 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-db
和nomigrations
指令实现的。
答案 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