class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
date_of_death = models.DateField('Died', null=True, blank=True)
MDN 说:
您不需要显式测试first_name和last_name是否已正确存储为数据库中的CharField,因为这是由Django定义的 ... 但是,您应该检查用于标签的文本(名字、姓氏、出生日期、死亡日期)以及为文本分配的字段大小(100 个字符),因为这些是您设计的一部分,并且可能会影响您的体验。将来会被打破/改变。
如果我想遵循这个建议,我不会编写一个测试来测试该字段只接受 100 个字符,因为这意味着测试 Django 的行为。相反,我会编写一个测试来测试
max_length
确实等于 100
。 def test_max_length(self):
self.assertEqual(models.Author._meta.get_field('first_name').max_length, 100)
我的感觉是这个测试基本上和测试我写的东西是一样的。当然,如果错误的
max_length
破坏了其他代码段,则应该对其进行测试,但应该在其他代码段中进行测试。测试 Django 模型字段的最佳实践是什么?除了来自 MDN 的引用之外,我只能找到“尽可能多地测试”或“如果它可能损坏,你应该测试它”之类的非常笼统的陈述。具体来说,我对测试代码/行为和配置之间的细线的资源或意见感兴趣。我还希望就以下问题提供意见:设置/参数可能具有的可能用途数量是否会影响该参数的测试方法。例如,有人可能会争辩说 max_length
的唯一目的是定义最大长度,因此开发人员不会出于不同的目标而意外更改它,也不会无意中更改 max_length
- 您只更改 max_length
如果你想改变max_length
.
编写测试,以便您能够控制一切。在一个小项目中,这似乎难以置信,但当事情失控时,它很快就会失控。然后它就会开始变得更有意义。
未经严格测试的程序很可能存在错误。没有测试的程序就死了。
在多个开发者共同贡献的基地中,你认为不必要的东西却是不可或缺的。我举一个简单的例子:
在模型
Author
中,由于空间限制,max_length
的 Author.first_name
设置为 20。具有此最大值的字段已被输入到数据库中,因此我们不能因为该字段而进一步降低。
def test_max_length(self):
self.assertEqual(models.Author._meta.get_field('first_name').max_length, 20)
上面的简单测试将在以下场景中有用:
max_length
的 Author.first_name
以允许更长的值,但不考虑空间限制。测试将会失败,如果添加了任何消息,他们就会知道为什么有这个要求。max_length
的 Author.first_name
以节省空间,但不知道数据库中已存在的值。测试也会失败,如果添加了任何消息,他们就会知道为什么会这样。最终,自动化测试可以在混乱时带来平静。 [1]
[1]我有点夸张了。