2011-08-25 303 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指令實現的。