2014-01-17 54 views
2

我想加載一個json夾具到Python 2.6/Django 1.4單元測試中。我可以在測試級別上使用Django的TestCase,但需要8-10秒才能加載(2M的json,不會變得更小)。因此運行一打測試真的很慢,而且我想只加載一次測試數據庫。它看起來像可能是可能的Python 2.6中,與unittest2,但我還沒有得到它的工作。Django Testcase,可以在類/模塊級加載燈具嗎?

# Works, but takes eight seconds per test. 
class BaseStuff(django.test.testcases.TestCase): 
    fixtures = ['test_data'] 

    def setUp(self): 
     # stuff 
    def test_one(self): 
     # stuff 

# Doesn't work - but runs *really* fast. 
class BaseStuff(unittest2.TestCase): 
    @classmethod 
    def setUpClass(cls): # Added in unittest2 
     fixtures = ['test_data'] 
     print "in setupClass()" # Does print, so function is called. 

試圖setupModule()沒有工作,要麼。設置功能肯定被調用,但似乎並不知道夾具。

因此,Django的TestCase將讀取燈具,而unittest2的TestCase將在類/模塊級別執行任務。有什麼方法可以結合這個操作,並在課堂/模塊級讀取燈具嗎?我嘗試了多重繼承,並且無法加載數據。

更新:基於@ robjohncox的建議,這個代碼,在模塊級:

from django.core import management 
management.call_command('loaddata', 'test_data.json', verbosity=1, noinput=True) 

似乎並創建一個數據庫。但是,然後Django似乎爲每個測試(這是空的)創建另一個數據庫。不知道如何告訴TestCase使用第一個數據庫(我試過Django和unittest2 TestCase)。

回答

0

您可以自行手動加載內setUpClass方法夾具數據來解決這個問題 - 有一個Django管理命令(loaddata),它可以爲你做這個可以是called from the code。正如你在你的例子中正確指出的那樣,這需要是unittest2.TestCase

+0

有關使用的更多信息?我嘗試設置'--database = test_foo',並且'test_foo連接不存在'(具有該名稱的數據庫確實存在)。在命令行上使用'loaddata'時,與在代碼中相比,結果相同。 –

+0

我認爲問題在於,因爲您沒有使用django TestCase,所以在運行測試時不會顯式創建數據庫。我想你可以在運行'loaddata'前通過在你的'setUpClass'方法中調用'syncdb'命令(帶有參數'--noinput')來解決這個問題。這不是我自己嘗試過的技術,但它聽起來像是應該起作用。希望這可以幫助。 – robjohncox

+0

實際上,我使用的是Django TestCase(並沒有改變代碼),我試着在模塊的頂部和TestCase中加載。將嘗試syncdb - 結果,沒有喜悅...嗯,現在我想知道它是否正在尋找settings.py中的數據庫名稱。更多測試... –

相關問題