为django模型编写测试用例

时间:2012-03-05 22:09:46

标签: python django django-models django-testing

在我目前的项目中途,在经历了无数次调试的痛苦之后,我决定采用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)

产品为例,单元测试应包含哪些内容?应该如何涵盖 ForeignKey ManyToManyField

2 个答案:

答案 0 :(得分:70)

这是我发现有用的文章:http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/。以下是测试内容的一个很好的总结:

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

     
      
  • 如果相关代码是内置的Python函数/库,请不要测试它。例如datetime库。

  •   
  • 如果有问题的代码内置于Django中,请不要测试它。示例如模型上的字段或测试内置函数   template.Node呈现包含的标签。

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

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

  •   

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

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

答案 1 :(得分:0)

我的CS350类TDD规定,最好的方法是测试所有访问器和变异器。因此,对于模型,您首先要编写调用每个评估器函数的测试,并确保其返回正确的值。

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

要恢复状态:如果模型具有字段a,b和c,则可以使用构造函数创建一个实例,然后确保所有这三个参数均已正确设置。假设还有另一个函数set_a()。您可以断言,不仅“ a”的值已更改,而且b和c的值保持不变。