似乎「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