2

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

我有几个模型紧密合作:

Resource这将维护一个文件资源

MetadataField代表一个可以添加到资源中的元数据字段,对应一个满是字段的表

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

MetadataSchema表示由许多MetadataFields. 每个都Resource被分配了一个MetadataSchema控制MetadataFields它的代表

关系:

Resource - MetadataField       : Many-to-Many through MetadataValue
MetadataValue - MetadataSchema : Many-to-Many
Resource - MetadataSchema      : One-to-Many

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

我在 django 中四处寻找单元测试模型的好例子,但找不到任何东西(django 网站似乎没有单元测试,这些项目要么测试不佳/缺少测试,要么在几个案例中有很好的测试,但几乎没有使用模型。

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

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

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

4

3 回答 3

1

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

为了测试单独的模块,尤其是当它们使用大量代码时,我更喜欢模拟依赖项。谷歌将此作为 Python 模拟的第一选择(我想那里有很多)。

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

祝你好运!

于 2012-12-25T15:14:24.127 回答
1

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

我建议您使用像Factory Boy这样的库,它允许您在需要时为您的测试按需创建对象。您可以根据需要设置任意数量的工厂,您可以在这里看到一些示例,在这里可以看到一些使用mocker 库进行模拟的示例以及许多测试 django 应用程序的技巧。

于 2012-12-29T21:04:17.343 回答
0

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

于 2012-12-25T11:02:04.383 回答