我是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所有人都很差/缺失测试或在几个案例中都有良好的测试,但几乎没有使用过模型。
以下是我看到的可能方法:
MetadataSchema
,这需要至少设置一个Resource
和try - except
。然后,我可以使用{{1}}块来确保如果测试在断言处理我实际上要测试的内容之前失败,则会给出一个特定的错误消息,表明错误位于其他地方。这样我就可以快速扫描多个失败的测试消息,找到真正的罪魁祸首。尽管我很难理解这一点,所以我不知道这一切是否有意义,但如果有这种情况的最佳做法,请指点他们!感谢
答案 0 :(得分:1)
对我而言,单元测试的目的是将代码的UNITS分开以仅测试它们,而不是担心它们的所有依赖项。如果我理解你的想法,你想要创建更多的集成测试(两个或更多模型之间的关系),这也是一个非常有用但仍然不同的测试层:)
要测试单独的模块,特别是当他们使用大量代码时,我更喜欢模拟依赖项。 Google返回this作为Python嘲笑的第一选择(我猜其中有很多选项)。
另一件事是,如果有太多依赖项你必须嘲笑它可能意味着你必须重新考虑你的架构,因为紧密耦合:)
祝你好运!答案 1 :(得分:1)
您可以使用django灯具加载数据进行测试,如果您的模型发生很大变化,这可能非常耗时且难以维护。
我建议您使用像Factory Boy这样的库,它允许您在需要时根据需要创建对象。您可以根据需要设置任意数量的工厂,您可以看到一些示例here和here您还可以看到一些关于使用mocker library进行模拟的示例以及有关测试django应用的大量提示
答案 2 :(得分:0)
使用fixtures,您可以在不编写代码的情况下加载模型数据。