2017-08-22 78 views
0

我想知道在Django中測試時是否可以訪問存儲在數據庫中的當前模型。在測試時訪問Django模型

謝謝!

+0

您是指當前模型的值?你爲什麼想這樣做? –

+0

您可以從應用程序對象中獲取模型。 –

+0

我該怎麼做?我如何啓動應用程序對象?我想檢查一下我的測試中有多少行在我的已填充表中,因爲我解析了一個csv來填充數據庫。這就是爲什麼我訪問 – ddomingo

回答

0

您可以使用IPDB:

pip install ipdb 

然後在測試功能放在一個破發點:

import ipdb; ipdb.set_trace() 

運行測試時,你可以訪問所有你會有一個交互的shell值與您在代碼中使用的方式相同Model.object.....

+0

只使用'./manage.py shell'有什麼區別? – Risadinha

+0

當您使用「manage.py test」測試您的代碼時Django創建測試數據庫並在測試結束時將其銷燬=>您無法使用shell訪問它。 – user2021091

0

如果您需要測試中的數據,則應爲其創建fixtures。最好的方法是使用./manage.py dumpdata --help

將輸出存儲在項目樹中以便能夠從測試中加載它。您可以使用像FIXTURES_DIR這樣的設置,但這不是必需的。您還可以將夾具文件存儲在他們所屬的測試附近。

我的經歷讓我創建了幾個只包含某些模型的小夾具文件。例如,我有一個小夾具文件,其中只包含我在測試中需要的一些用戶。該夾具在需要認證的任何地方加載。當然,包含與用戶對象相關數據的所有其他燈具都需要更改爲這些測試用戶,或者需要將相關用戶添加到燈具。您將不得不嘗試四處修復您的夾具數據,以使其完成測試。您很可能不希望將所有生產數據都作爲測試裝置。

在你測試你指定這樣的燈具:

from django.test import TestCase 

class SomeTest(TestCase): 
    USER_DICT = { 
     'username': 'django-test', 
     'password': 'XXX' 
    } 

    fixtures = [ 
     # fixture for django-test and other users 
     os.path.join(settings.FIXTURE_DIR, 'auth_fixture.json'), 
     # core models for some app 
     os.path.join(settings.FIXTURE_DIR, 'core.json'), 
    ] 

def test_one(self): 
    # uses clean fixtures 
    # modify, delete or add data 
    pass 

def test_two(self): 
    # uses clean fixtures 
    # the changes of test_one have been reset 
    pass 

這會自動加載燈具爲每個測試。您可以在一次測試(單一測試方法)期間修改,刪除和添加數據,並且所有數據都將重置爲下一次測試的原始數據(下一個方法)。

0

是的!

這是一個好主意嗎?希望有更簡單和更安全的方法來實現你的目標。

默認情況下,django測試運行器creates a database前加test_,部分是爲了防止您的數據庫意外執行破壞性測試!

因爲django的模型與測試運行器集成測試緊密集成(編寫與數據庫實際交互的測試非常快)。這主要是因爲每個測試都是在一個事務中執行的,並且在測試拆卸期間,事務被回滾。由於測試速度如此之快,因此慣例是根據需要在每個測試中創建測試數據(固件),而不是依賴全局數據庫狀態。這也會讓您的測試更加孤立和專注。


當然,在很多情況下,您可能想測試生產。要做到這一點,您可以使用常規測試運行器(unittest.TestCase,因此不會出現測試數據庫),然後直接導入模型並查詢數據庫。

但是,如果您的意圖是「我想檢查我的測試中有多少行在我的已填充表中,因爲我解析了一個csv來填充數據庫」。那麼爲什麼你不能創建一個Django的單元測試,在那裏你有一個虛假的CSV,執行代碼解析/加載它,然後在你的測試用例的上下文中查詢你的數據庫?它在django測試用例的上下文中提供了很多保護和速度。

如果您最終創建了某種直接查詢數據庫的功能/自動化測試,那麼創建READ ONLY數據庫用戶可能是一個好主意。