为 django 模型编写测试用例

Posted

技术标签:

【中文标题】为 django 模型编写测试用例【英文标题】:Writing test cases for django models 【发布时间】:2012-03-23 09:45:39 【问题描述】:

我目前的项目进行到一半,在经历了无数分钟调试的痛苦之后,我决定采用 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

【问题讨论】:

【参考方案1】:

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

对于刚接触测试的开发人员/设计师来说,另一个常见的挫折是 “我应该(或不应该)测试什么?”的问题虽然没有 这里的硬&快速规则巧妙地适用于任何地方,有一些 在做出决定时我可以提供的一般准则:

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

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

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

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

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

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

【讨论】:

是的,它真的帮助了我。我认为测试是开发中最重要的部分之一,但由于时间限制而经常被忽视。这也是为什么编写高效、有效和非冗余的测试如此重要的原因。快乐测试! :-) @Furbeenator 我的同事说我们应该测试auto_add 字段,因为将来有人可能会更改和/或删除它。她说的对吗? 您好,您提供的链接无效。 您为我节省了大量时间。干杯。 该链接不再有效,但我认为您提供的摘要部分错误。我们配置模型的方式很容易出现错误和错误,因此我们需要测试字段。我们需要知道我们有一个正确模型的 FK,我们需要知道我们在 CharField 上有正确的max_length。这不是测试 Django,这是测试我们自己的代码,而 Django 恰好为我们提供了一种更短的编写方式。【参考方案2】:

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

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

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

【讨论】:

以上是关于为 django 模型编写测试用例的主要内容,如果未能解决你的问题,请参考以下文章

Django 1.4 表单向导测试用例

6.Django基于模拟浏览器的测试用例编写python-slugifydjango-taggit

软件测试的分类&测试用例的设计&如何编写测试用例

Django 测试用例错误“WSGIRequest”对象没有属性“会话”

Django 不会为某些测试用例重新加载夹具

测试用例的编写