2010-04-06 70 views
4

如何針對生產數據庫而不是測試數據庫運行單元測試?如何針對生產數據庫運行單元測試?

我有一個錯誤似乎發生在我的生產服務器上,但不在我的開發計算機上。

我不在乎數據庫是否被刪除。

+2

第一個明顯的問題是:你能得到一個數據庫的副本嗎? – 2010-04-07 00:06:13

+0

我會嘗試首先複製所有數據庫環境,即相同的數據庫軟件,相同的版本,相同的設置,相同的數據。使您的開發數據庫與生產數據庫真正相同。 – 2010-04-07 08:21:16

+0

你沒有。單元測試不會與數據庫交談。 – 2010-04-09 19:40:40

回答

3

複製數據庫或導致問題的數據庫的一部分是否可行?如果您保留了一臺備份服務器,您可能可以從那裏複製數據(確保您有另一個備份,以防備份數據庫)。

基本上,你不想混淆實時數據,並且你不想留下沒有備份的情況,以免你把事情搞砸(你會的!)。

+1

Django有一種方法可以告訴測試運行者複製生產數據庫而不是創建一個空的數據庫嗎? – 2011-07-07 12:42:35

0

複製數據庫...這真是一個很好的做法!

只需執行測試,而不是調用commit,在最後調用回滾。

0

首先要嘗試的應該是在生產服務器上的shell上手動執行測試代碼。

python manage.py shell 

如果不工作,你可能需要傾倒生產數據,本地複製它,並把它作爲你正在使用的測試用例的常客。

如果有一種方法可以讓django使用標準數據庫而不需要創建一個新的標準數據庫,我認爲不是創建一個夾具,而是創建一個sqldump,它通常是一個更小的文件。

1

簡答:你沒有。

龍答:你沒有,你使生產數據庫的副本,並運行它有

0

如果你真的不關心搗毀分貝,然後滾動的馬可的答案回交易是我的也是首選。你也可以嘗試NdbUnit,但我個人認爲它帶來的額外負擔是值得的。

你現在如何測試測試數據庫?通過測試分貝你的意思是SQLite?

HTH,
Berryl

1

使用manage.py dumpdata > mydata.json從數據庫獲取數據的副本。

轉到您的本地機器,將mydata.json複製到您應用的子目錄fixturesmyapp/fixtures/mydata.json做:

manage.py syncdb # Set up an empty database 
manage.py loaddata mydata.json 

本地數據庫將數據填充,你可以測試了。

0

我有一個完整的緩慢的django測試數據庫套件和一個瘋狂的快速運行反生產測試套件從一個共同的測試模塊構建。我使用生產套件在開發過程中檢查我的更改,並將其作爲我開發計算機上的提交驗證步驟。Django的套件模塊如下所示:

import django.test 
import my_test_module 
... 
class MyTests(django.test.TestCase): 
    def test_XXX(self): 
     my_test_module.XXX(self) 

生產測試套件模塊採用裸單元測試,看起來像這樣:

import unittest 
import my_test_module 
class MyTests(unittest.TestCase): 
    def test_XXX(self): 
     my_test_module.XXX(self) 
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests) 
unittest.TextTestRunner(verbosity=2).run(suite) 

測試模塊如下:

def XXX(testcase): 
    testcase.assertEquals('foo', 'bar') 

我像這樣運行裸單元測試版本,所以我的測試在任何情況下都可以使用django ORM:

% python manage.py shell < run_unit_tests 

其中run_unit_tests包括:

import path.to.production_module 

生產模塊需要一個稍微不同的設置()和tearDown()從Django的版本,你可以把任何所需的表清理在那裏。我還通過模擬測試客戶端類使用Django的測試客戶端共同測試模塊:

class FakeDict(dict): 
    """ 
    class that wraps dict and provides a getlist member 
    used by the django view request unpacking code, used when 
    passing in a FakeRequest (see below), only needed for those 
    api entrypoints that have list parameters 
    """ 
    def getlist(self, name): 
     return [x for x in self.get(name)] 

class FakeRequest(object): 
    """ 
    an object mimicing the django request object passed in to views 
    so we can test the api entrypoints from the developer unit test 
    framework 
    """ 
    user = get_test_user() 
    GET={} 
    POST={} 

這是一個測試模塊功能的一個例子是通過客戶端測試:

def XXX(testcase): 
    if getattr(testcase, 'client', None) is None: 
     req_dict = FakeDict() 
    else: 
     req_dict = {} 
    req_dict['param'] = 'value' 
    if getattr(testcase, 'client', None) is None: 
     fake_req = FakeRequest() 
     fake_req.POST = req_dict 
     resp = view_function_to_test(fake_req) 
    else: 
     resp = testcase.client.post('/path/to/function_to_test/', req_dict) 
    ... 

我已經發現這種結構運行得非常好,該套件的超快速生產版本是一個重要的節省時間。

0

如果您的數據庫支持模板數據庫,請將生產數據庫用作模板數據庫。確保您的Django數據庫用戶具有足夠的權限。

如果您使用PostgreSQL,您可以輕鬆地將生產數據庫的名稱指定爲POSTGIS_TEMPLATE(並使用PostGIS後端)。

相關問題