2009-03-05 54 views
3

我會經常爲我的django項目運行測試用例。但其中一個 它發生在我身上,django實際上檢查 設置.DATABASE_NAME db實際存在運行測試用例。 這是爲什麼。所有我以爲是Django將採取 settings.DATABASE_NAME並創建一個名爲'test_'的測試數據庫+ settings.DATABASE_NAME。它還會檢查數據庫名稱是否爲 ,實際上是否存在(對於創建測試數據庫的 )?理想情況下,只應該檢查名稱 但不是db的實際存在權利?爲什麼django檢查settings.DATABASE_NAME db是否確實存在運行測試用例?

我瀏覽了django源代碼,發現用於創建testdb的「連接」實際上是使用DATABASE設置選項創建的。所有這些都應該關注環境的價值,而不是它們的實際存在。對?

回答

3

整潔的問題......你知道,這從來沒有發生過我。簡單的答案是,Django本身不需要需要來驗證DATABASE_NAME實際存在,但它確實需要連接到數據庫才能創建測試數據庫。大多數數據庫接受(並且需要)DATABASE_NAME以便形成連接字符串;通常這是因爲您連接的數據庫名稱會影響連接會話的權限。

由於測試數據庫尚不存在,因此django必須首先使用正常settings.DATABASE_NAME進行連接,以創建測試數據庫。

所以,它的工作原理是這樣的:

  • Django的測試運行通過關閉以特定於後臺的數據庫處理程序
  • 特定於後臺的數據庫處理程序的函數叫做create_test_db將使用正常的設置連接到數據庫。它使用普通的cursor = self.connection.cursor()命令執行此操作,該命令顯然使用正常的設置值,因爲在這一點上它已知存在。
  • 連接到數據庫後,特定於後端的處理程序將使用新測試數據庫的名稱發出CREATE DATABASE命令。
  • 的特定於後端的處理程序關閉連接,然後返回到測試運行,其交換爲test_database_name
  • 測試將然後運行正常正常settings.DATABASE_NAME。所有後續調用connection.cursor()將使用正常設置模塊,但現在該模塊已換出數據庫名稱
  • 最後,測試運行程序在調用後端特定處理程序的destroy_test_db函數後恢復舊數據庫名稱。

如果您有興趣,主要部分的相關代碼位於django.db.backends.creation中。看看_create_test_db功能。

我想Django設計人員可能會在db-by-db基礎上做出例外,因爲並不是每個DB都需要連接字符串中的當前數據庫名稱,但這需要一點重構。目前,create_test_db函數實際上是在backend基類之一中,並且大多數實際的後端處理程序不會覆蓋它,所以在每個後端都有相當數量的代碼推送下游並複製。

+0

太棒了Jarret!謝謝 – 2009-03-06 06:31:11

相關問題