django - 如何使用 Django 模型应用测试驱动开发?

标签 django unit-testing testing tdd django-testing

我最近了解了测试驱动开发,并想在我的 Django 项目中开发新应用程序时试一试。我一直在阅读 Test-Driven Development with Python这很棒。然而,有时我发现书中的示例(待办事项列表)过于简单——例如,当 testing Models is introduced ,作者有一个测试创建对象,保存它们,然后从数据库中拉出对象来检查它们的值。当然,当您的模型只有一个 ModelField 时,这很容易。

但是当您的模型有 20 个 ModelField 时呢?您是否应该有一个创建对象及其所有字段的测试,然后保存该对象,然后检查每个字段的值?对每个领域进行单独测试是否更好?

在我的具体案例中,我有一个包含大约五个必填字段的模型,然后还有大约十五个可选字段。我现在的想法是首先在我的 TestCase 类中创建一个函数,该函数使用默认字段创建该模型的对象。然后,我将进行测试以确保该对象正常保存,然后对每个单独的可选字段进行另一次测试。看起来是很多测试,但是很多小测试不是比一个大测试好吗?

洞察力赞赏!

最佳答案

我是这本书的作者。我的意思是该测试更多地是对 Django ORM 的介绍,而不是最佳实践的演示,我当时试图对此进行解释,但我想有些混淆是不可避免的。我会考虑如何以不同的方式呈现事物。

无论如何,如果您跳到 a few chapters later在书中,我展示了如何将测试简化为更符合最佳实践的东西。

是否测试基本的 Django 模型由您决定——有些人会说测试声明性语法是多余的,其他人会说简短的测试作为占位符是很好的。这是您可能会用到的:

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author)
    ISBN = models.CharField(max_length=35)
    abstract = models.TextField()


class BookTest(TestCase):

    def test_defaults(self):
        book = Book()
        self.assertEqual(book.title, '')
        self.assertEqual(book.author, None)
        self.assertEqual(book.ISBN, '')
        self.assertEqual(book.abstract, '')

所以这是一个占位符。如果您开始引入更复杂的字段,例如 publication_date 字段,它会鼓励您添加更多测试,该字段的默认值为 datetime.today() + one_month,这可能需要进行一些测试以确保您做对了。使用占位符可以降低后续测试的障碍。其他人会告诉你这太过分了。你必须找到自己的平衡点。

广为接受的一件事是您绝对应该测试行为。因此,如果您的模型具有自定义方法:

class Book(models.Model):
    # [...]

    def is_available(self):
        return self.pub_date < datetime.today() and Stock.objects.filter(book=self).count() > 0

然后对此进行某种测试绝对是个好主意。

关于django - 如何使用 Django 模型应用测试驱动开发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789199/

相关文章:

java - 在 Spring Boot 应用程序中使用 Mockito

c# - Rhino 模拟列表约束

java - TestNG 中的 RunListener 等价物

django - 是否可以更改 Django 中的 management/commands 目录?

python - 如何在 Django 中为字典批量创建和保存对象

python - 我如何通过 django session 中存储的属性来限制 django 外键选择

ruby-on-rails - 为什么记录在我的 Rails 应用程序中消失了?

javascript - Protractor 通过名称标签获取元素

unit-testing - 在 mapDispatchToProps 中声明的 Sinon stub 实例方法

Django db 备份 postgres 错误