【问题标题】:Unit testing database access layer单元测试数据库访问层
【发布时间】:2012-02-18 15:49:18
【问题描述】:

我知道这个问题以前被问过很多次,但我有一些具体的代码示例,我想知道对它们进行单元测试是否有意义:

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"

对上述代码进行单元测试是否有意义,以及如何进行。这里有两个复杂的因素:

  • 数据库本身并不简单,我目前没有简单的方法来创建包含所有测试数据的数据库
  • 架构在不断发展,这意味着不可能一劳永逸地创建测试数据库。

【问题讨论】:

    标签: python database unit-testing


    【解决方案1】:

    根据您的要求,测试代码总是有意义的。也就是说,您在这里所做的非常简单,可能不需要测试。但是,我认为即使设置测试数据库很困难,您也很可能以后会需要它,所以当您不尝试做一些复杂的事情时,不妨现在就去做。此外,它发现架构正在演变。随着时间的推移,数据库发生重大变化几乎是不可避免的,您只需要顺其自然。

    我能想到的不测试的唯一充分理由是您是否希望很快彻底更改数据库。

    【讨论】:

      【解决方案2】:

      单元测试(即没有数据库),而不是 IMO。集成测试一般我认为是个好主意。

      数据库本身并不简单,我目前没有简单的方法来创建包含所有测试数据的数据库

      您如何维护架构?在你前进之前,你需要把这件事做好。 您可以在一个自动化步骤中从一个空白数据库转到一个至少具有架构的数据库吗?如果你没有一个好的系统来保持数据库最新,我猜不是这样 Liquibase 可以帮助你。

      现在是测试数据 - 保持所需数据较小。

      【讨论】:

      • 是的,有一种初始化空白数据库的简单方法:我们使用 SQLAlchemy 来维护模型。由于架构会定期更改,因此测试数据更加严格。
      • 它多久更改一次? stackoverflow.com/questions/1346037/…
      猜你喜欢
      • 2015-11-27
      • 2013-07-04
      • 2015-07-13
      • 2013-02-06
      • 1970-01-01
      • 2011-02-16
      • 2011-10-24
      • 2014-01-10
      • 1970-01-01
      相关资源
      最近更新 更多