2008-09-26 82 views
6

我想寫測試,可以顯示數據庫是否與我的models.py文件同步。其實我已經寫過它們,只是爲了發現每次基於models.py文件運行測試時,django都會創建一個新的數據庫。 有沒有什麼辦法可以讓models.py test使用現有的數據庫模式?在mysql/postgresql中,而不是在/myapp/models.py中的那個?如何測試django數據庫模式?

我不在乎這是在數據庫中的數據,我只在乎它的模式即我希望我的測試發現,如果在數據庫中的表比模式少場在我的models.py文件。

我使用unittest框架(實際上是它的django擴展),如果這有任何相關性。

感謝

回答

8

我們所做的是覆蓋默認test_runner所以它不會創建一個新的數據庫來測試對。通過這種方式,它可以針對我們當前的本地數據庫外觀進行測試。但是,如果您使用此方法,請非常小心,因爲您在測試中對數據進行的任何更改都將是永久性的。我確信我們所有的測試都能將所有的變化恢復到原來的狀態,並將我們原始版本的數據庫保存在服務器上並進行備份。

因此,要做到這一點,你需要從django.test.simple複製RUN_TEST方法在項目中的位置 - 我把礦的myproject /測試/ test_runner.py

然後進行以下修改該方法:

// change 
old_name = settings.DATABASE_NAME 
from django.db import connection 
connection.creation.create_test_db(verbosity, autoclobber=not interactive) 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 
connection.creation.destroy_test_db(old_name, verbosity) 

// to: 
result = unittest.TextTestRunner(verbosity=verbosity).run(suite) 

確保做到在頂部所有必要的進口,然後在你的設置文件中設置的設置:

TEST_RUNNER = 'myproject.test.test_runner.run_tests' 

現在,當你運行。 /manage.py測試Django將針對數據庫的當前狀態運行測試,而不是根據當前的模型定義創建新版本。

你可以做的另一件事情是在本地創建數據庫的副本,然後做一次檢查在新RUN_TEST()方法是這樣的:

if settings.DATABASE_NAME != 'my_test_db': 
    sys.exit("You cannot run tests using the %s database. Please switch DATABASE_NAME to my_test_db in settings.py" % settings.DATABASE_NAME) 

這樣,沒有運行測試對危險的主數據庫。