1

我使用 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 到达那里。

4

1 回答 1

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
于 2013-03-07T23:21:38.623 回答