单元测试数据库访问层

问题描述:

我知道这个问题已经被问过很多次,但我有一些具体的代码示例,我想知道是否是有意义的单元测试他们:单元测试数据库访问层

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" 

它使感觉单元测试上面的代码,以及如何去做这件事。这里有两个复杂的因素:

  • 数据库本身是不平凡的,我目前还没有简单的方法来创建所有测试数据
  • 架构是不断发展的数据库,这意味着它是不可能创建一个测试数据库一劳永逸。

根据你的问题,测试代码总是有意义的。也就是说,你在这里做的事很简单,可能不需要测试。然而,我认为即使建立一个测试数据库很困难,你仍然很可能晚些时候需要它,所以如果你不想做一些复杂的事情,你现在也可以做。另外,它发现模式正在发展。随着时间的推移,数据库将会发生重大变化,而且您必须随时更新,这几乎是不可避免的。

我可以考虑不测试的唯一好理由是,如果你期望完全改变数据库很快。

单元测试(即没有数据库),而不是IMO。综合测试通常我认为这是一个好主意。

数据库本身是不平凡的,我目前还没有简单的方法来创建所有测试数据

你如何维护模式的数据库?你需要在你前进之前得到它。 你可以从一个空白数据库转到一个至少在一个自动化步骤中使用模式的数据库吗?我猜不是Liquibase可以帮助你,如果你没有一个好的系统来保持db是最新的。

现在的测试数据 - 保持所需的数据很小。

+0

是的,有一个简单的方法来初始化一个空白数据库:我们用SQLAlchemy维护模型。由于模式定期更改,因此测试数据更加困难。 – ipartola 2012-02-19 03:02:50

+0

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