如何使用TDD创建现有对象的数据库表示?

时间:2013-03-07 23:00:10

标签: python database django tdd

我使用TDD在Python中开发了一组类。这些对象包含数据字段,函数和相互链接。功能上的一切都像我想要的那样。

最终所有这些都应存储在数据库中,以便在Django Web应用程序中使用。

我已经勾勒出一些可能的数据库模式来保存相同的信息,但我认为这是一个“突然的大跃进”,与传统的TDD开发其余应用程序的方式相比。

所以,现在我想知道,我应该编写哪些测试来强制我以逐步的TDD方式将这些对象存储在数据库中?

让这个问题更具体一点,这些课程目前是这样的:

class Connector(object):
  def __init__(self, title = None):
    self.value = None
    self.valid = False
    self.title = title
  ...

class Element(object):
  def __init__(self, title = None):
    self.title = title
    self.input_connectors = []
    self.output_connectors = []
    self.number_of_runs = 0

  def run(self):
    ...
    self.number_of_runs += 1

class Average(Element):
  def __init__(self, title = None):
    super(OpenCVMean, self).__init__(title = title)
    self.src = Connector("source")
    self.avg = Connector("average")
    self.input_connectors.append(self.src)
    self.output_connectors.append(self.avg)

  def run(self):
    super(Average, self).run()
    self.avg.set_value(numpy.average(self.src.value))

我意识到一些数据应该在数据库中,而处理函数则不应该。我认为应该有一个表来表示Element的不同“类型/子类”的细节,同时还有一个存储实际实例的表。但是,正如我所说,我不知道如何使用TDD到达那里。

1 个答案:

答案 0 :(得分:2)

首先,问问自己是否要测试代码或Django ORM。大多数时候,存储和阅读都会很好。

您需要测试的事项是验证数据以及非模型字段的任何属性。我认为你应该通过在数据库的下一层编写测试来最终得到一个好的模式。

此外,使用South或其他一些迁移方式可以降低架构更改的成本。这会让你安心。

如果您有多个级别的测试(例如集成测试),则检查数据库配置是否完好是有意义的。大多数测试不需要访问数据库。您可以通过模拟模型或某些数据库操作(至少save())来完成此操作。话虽如此,您可以使用这个简单的测试来检查数据库写入和读取:

def test_db_access(self):
    input = Element(title = 'foo')
    input.save()

    output = Element.objects.get(title='foo')

    self.assertEquals(input, output)

模拟保存:

def save(obj):
    obj.id = 1