在Django中对紧密耦合的模型进行单元测试

时间:2012-12-25 10:50:33

标签: python django unit-testing model-view-controller mocking

我是django和单元测试的新手,我正在尝试为我的模型构建单元测试但是遇到了一些困难。

我有几个模特紧密合作:

Resource将维护文件资源

MetadataField表示可以添加到资源的元数据字段,对应于一个充满字段的表

MetadataValue将MetadataField ID与资源ID和相应的值匹配,这是Resource - MetadataField多对多关系的中间表

MetadataSchema表示由许多MetadataFields组成的模式。每个Resource都会分配一个MetadataSchema,用于控制MetadataFields代表哪个Resource - MetadataField : Many-to-Many through MetadataValue MetadataValue - MetadataSchema : Many-to-Many Resource - MetadataSchema : One-to-Many

关系:

MetadataValue

我不确定如何编写测试来处理这些模型。 Test Driven Django教程中的模型测试似乎主要包括初始化对象和验证属性。如果我对这些对象进行任何设置,虽然它需要使用所有其他对象,因此测试将全部依赖于它们不打算测试的代码。 例如如果我想创建一个资源,我还应该为它分配一个元数据模式和该模式中字段的值。

我在django中寻找了单位测试模型的好例子但是却找不到任何东西(django网站似乎没有单元测试,these projects所有人都很差/缺失测试或在几个案例中都有良好的测试,但几乎没有使用过模型。

以下是我看到的可能方法:

  • 做了很多Mocking,以确保我只测试一个类,并保持模型上的单元测试非常简单,只测试他们的方法/属性,但不测试关系是否正常运行。然后依靠更高级别的集成测试来解决关系中的任何问题等。
  • 设计单元测试,它依赖于其他功能,并接受一个函数中断将打破多个测试,前提是它很容易看到故障发生的位置。所以我可能会有一个方法来测试我是否可以成功地向资源添加MetadataSchema,这需要至少设置一个Resourcetry - except。然后,我可以使用{{1}}块来确保如果测试在断言处理我实际上要测试的内容之前失败,则会给出一个特定的错误消息,表明错误位于其他地方。这样我就可以快速扫描多个失败的测试消息,找到真正的罪魁祸首。尽管
  • ,但在每次测试中都不可能可靠地进行这种分离

我很难理解这一点,所以我不知道这一切是否有意义,但如果有这种情况的最佳做法,请指点他们!感谢

3 个答案:

答案 0 :(得分:1)

对我而言,单元测试的目的是将代码的UNITS分开以仅测试它们,而不是担心它们的所有依赖项。如果我理解你的想法,你想要创建更多的集成测试(两个或更多模型之间的关系),这也是一个非常有用但仍然不同的测试层:)

要测试单独的模块,特别是当他们使用大量代码时,我更喜欢模拟依赖项。 Google返回this作为Python嘲笑的第一选择(我猜其中有很多选项)。

另一件事是,如果有太多依赖项你必须嘲笑它​​可能意味着你必须重新考虑你的架构,因为紧密耦合:)

祝你好运!

答案 1 :(得分:1)

您可以使用django灯具加载数据进行测试,如果您的模型发生很大变化,这可能非常耗时且难以维护。

我建议您使用像Factory Boy这样的库,它允许您在需要时根据需要创建对象。您可以根据需要设置任意数量的工厂,您可以看到一些示例herehere您还可以看到一些关于使用mocker library进行模拟的示例以及有关测试django应用的大量提示

答案 2 :(得分:0)

使用fixtures,您可以在不编写代码的情况下加载模型数据。