python - 在 Django 中对紧耦合模型进行单元测试

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

我对 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 添加到资源中,这需要设置至少一个 MetadataSchemaResource >。然后,我可以使用 try - except block 来确保如果测试在处理我实际要测试的内容的断言之前失败,它会给出一条特定的错误消息,表明错误位于其他地方。这样我就可以快速扫描多条失败的测试消息以找到真正的罪魁祸首。但不可能在每次测试中都可靠地进行这种分离

我很难理解这个问题,所以我不知道这一切是否有意义,但如果有针对这种情况的最佳实践,请向我指出!谢谢

最佳答案

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

我建议你使用像 Factory Boy 这样的库,它允许您在需要时按需创建测试对象。你可以设置任意数量的工厂,你可以看一些例子herehere您还可以使用 mocker library 查看一些有关模拟的示例以及许多有关测试 django 应用程序的技巧。

关于python - 在 Django 中对紧耦合模型进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14029946/

相关文章:

python - 如何忽略 Sentry 捕获中的某些 Python 错误

django - 由于未知原因无法使用 pipenv 安装 Django(但可以使用 pip)

php - 使用抽象参数实例化对象

python - Django ManyToManyField 在管理中保存时出错?

python - spacy 没有安装

python - 在 opencv python 中实现光流时选择我自己的点而不是角点

python - 如何更改不同网址的模板

python - 我应该使用哪个,为什么?有关系吗? SafeUnicode 还是 django.utils.safestring.mark_safe()?

python-3.x - assertLogs 可以检查日志消息的格式吗?

c++ - 升压测试应用程序初始化