45

我目前的项目进行到一半,在经历了无数分钟调试的痛苦之后,我决定采用 TDD。首先,我计划为每个现有模型编写一组单元测试。但是对于只定义了属性的模型(即没有其他方法/属性),我不确定我需要测试什么或如何测试。

class Product(models.Model):
    name = models.CharField(max_length=50)
    description = models.TextField(default='', blank=True)
    retails = models.ManyToManyField(Retail, verbose_name='Retail stores that carry the product')
    manufacturer = models.ForeignKey(Manufacturer, related_name='products')
    date_created = models.DateTimeField(auto_now_add=True)
    date_modified = models.DateTimeField(auto_now=True)

Product为例,单元测试应该涵盖哪些内容?又应该如何覆盖ForeignKeyManyToManyField ?

4

2 回答 2

87

这是一篇我觉得很有帮助的文章:A Guide to Testing in Django (archived link)。以下是要测试的内容的一个很好的总结:

对于刚接触测试的开发人员/设计师来说,另一个常见的挫折是“我应该(或不应该)测试什么?”的问题。虽然这里没有适用于任何地方的硬性规定,但我可以提供一些通用的指导方针来做出决定:

  • 如果有问题的代码是内置的 Python 函数/库,请不要对其进行测试。日期时间库等示例。

  • 如果有问题的代码内置在 Django 中,请不要对其进行测试。例如模型上的字段或测试内置 template.Node 如何呈现包含的标签。

  • 如果您的模型有自定义方法,您应该对其进行测试,通常使用单元测试。

  • 自定义视图、表单、模板标签、上下文处理器、中间件、管理命令等也是如此。如果您实现了业务逻辑,您应该测试代码的各个方面。

因此,对于您的示例,在您编写一些自定义函数之前,实际上不会有任何要测试的东西。
在我看来,测试ForeignKeyManyToManyField链接属于第二类(Django 内置的代码),所以我不会测试这些,因为您实际上是在测试 Django 是否正常运行。如果您有一个创建产品实例的方法,包括外部关系和 M2M,您可以验证数据是否已创建,这将是测试您的自定义方法,而不是 Django 功能。

使用 TDD 范式,构建测试以验证业务逻辑和设计要求。

于 2012-03-05T23:14:01.577 回答
2

我的 CS350 类 TDD 规定测试所有访问器和修改器是最佳实践。因此,对于模型,您将首先编写调用每个评估器函数的测试,并确保它返回正确的值。

对于更改模型中数据字段的每个函数,您不仅要特别测试该数据字段的结果,还要测试模型实例中的所有其他字段,以确保没有一个被错误修改.

重新统计:如果模型具有字段 a、b 和 c,您将使用您的构造函数创建一个实例,然后资产所有三个都已正确设置。假设还有另一个函数 set_a()。您会断言不仅 'a' 的值发生了变化,而且 b 和 c 的值保持不变。

于 2019-07-14T16:55:52.427 回答