2012-02-18 167 views
2

我知道這個問題已經被問過很多次,但我有一些具體的代碼示例,我想知道是否是有意義的單元測試他們:單元測試數據庫訪問層

class FooAPI(object): 

    def create(self, prop1, prop2, prop3, prop4, prop5): 
     sql = "INSERT INTO foo (prop1, prop2, prop3) VALUES (?, ?, ?)" 
     self.connection.execute(sql, (prop1, prop2, prop3)) 

     foo_id = self.connection.insert_id() 

     sql = "INSERT INTO foo_settings (foo_id, prop4, prop5) VALUES (?, ?, ?)" 
     self.connection.execute(sql, (foo_id, prop4, prop5)) 

     return foo_id 

    def update(self, foo_id, prop1, prop2, prop3, prop4, prop5): 
     "Update code similar to above" 

    def delete(self, foo_id): 
     sql = "DELETE FROM foo WHERE foo_id = ?" 
     self.connection.execute(sql, (foo_id,)) 

    def find(self, foo_id=None, prop1=None): 
     "Find objects by ID or by prop1" 

它使感覺單元測試上面的代碼,以及如何去做這件事。這裏有兩個複雜的因素:

  • 數據庫本身是不平凡的,我目前還沒有簡單的方法來創建所有測試數據
  • 架構是不斷髮展的數據庫,這意味着它是不可能創建一個測試數據庫一勞永逸。

回答

0

根據你的問題,測試代碼總是有意義的。也就是說,你在這裏做的事很簡單,可能不需要測試。然而,我認爲即使建立一個測試數據庫很困難,你仍然很可能晚些時候需要它,所以如果你不想做一些複雜的事情,你現在也可以做。另外,它發現模式正在發展。隨着時間的推移,數據庫將會發生重大變化,而且您必須隨時更新,這幾乎是不可避免的。

我可以考慮不測試的唯一好理由是,如果你期望完全改變數據庫很快。

0

單元測試(即沒有數據庫),而不是IMO。綜合測試通常我認爲這是一個好主意。

數據庫本身是不平凡的,我目前還沒有簡單的方法來創建所有測試數據

你如何維護模式的數據庫?你需要在你前進之前得到它。 你可以從一個空白數據庫轉到一個至少在一個自動化步驟中使用模式的數據庫嗎?我猜不是Liquibase可以幫助你,如果你沒有一個好的系統來保持db是最新的。

現在的測試數據 - 保持所需的數據很小。

+0

是的,有一個簡單的方法來初始化一個空白數據庫:我們用SQLAlchemy維護模型。由於模式定期更改,因此測試數據更加困難。 – ipartola 2012-02-19 03:02:50

+0

它變化的頻率如何? http://stackoverflow.com/questions/1346037/changing-database-schemas-unit-tests – 2012-02-19 12:16:33