我对 django 和单元测试都很陌生,我正在尝试为我的模型构建单元测试,但遇到了一些困难。
我有几个模型紧密合作:
Resource
将维护文件资源
MetadataField
表示可以添加到资源中的元数据字段,对应一个充满字段的表
MetadataValue
将 MetadataField ID 与资源 ID 和相应的值进行匹配,这是资源 - 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 网站似乎没有单元测试,并且 these projects 都没有很好/缺少测试,或者在一些情况下进行了良好的测试,但几乎没有使用模型。
以下是我看到的可能的方法:
- 进行大量模拟,以确保我只测试一个类,并使模型上的单元测试非常简单,仅测试它们的方法/属性,而不测试关系是否正常运行。然后依靠更高级别的集成测试来发现关系等中的任何问题。
- 设计的单元测试确实依赖于其他功能,并接受一个功能的中断将中断多个测试,前提是仍然可以轻松地看出故障发生的位置。因此,我可能有一种方法来测试是否可以成功地将
MetadataValue
添加到资源中,这需要设置至少一个MetadataSchema
和Resource
>。然后,我可以使用 try - except block 来确保如果测试在处理我实际要测试的内容的断言之前失败,它会给出一条特定的错误消息,表明错误位于其他地方。这样我就可以快速扫描多条失败的测试消息以找到真正的罪魁祸首。但不可能在每次测试中都可靠地进行这种分离
我很难理解这个问题,所以我不知道这一切是否有意义,但如果有针对这种情况的最佳实践,请向我指出!谢谢
最佳答案
您可以使用 django 夹具加载数据进行测试,如果您的模型变化很大,这可能非常耗时且难以维护。
我建议你使用像 Factory Boy 这样的库,它允许您在需要时按需创建测试对象。你可以设置任意数量的工厂,你可以看一些例子here和 here您还可以使用 mocker library 查看一些有关模拟的示例以及许多有关测试 django 应用程序的技巧。
关于python - 在 Django 中对紧耦合模型进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029946/