首页 > 解决方案 > Django 模型单元测试:对新手的帮助

问题描述

是的,这是我想问的最后一个地方,因为这个问题非常模糊,但我很茫然。

基本上,我正在尝试学习如何编码,并且我目前正在使用 Django 来帮助我掌握后端的东西。我不断被提醒单元测试的重要性,所以我想将它们包含在我正在从事的虚拟项目中,这样我就可以在我的编程之旅的早期开始理解它们......只是......它们看起来很容易从表面上看,但对于初学者来说显然比我认为的要复杂得多。

我不完全确定哪里/如果我在这里出错了,所以请随意戳我并取笑,但请尝试为我指出正确的方向,或者指向一些初学者友好的资源(在互联网上搜索并且没有海量信息)。

我的项目是一个与警务相关的虚拟 GUI(希望将来在我的投资组合中使用它)

这是我需要测试帮助的模型类。还有其他的,但一旦我知道更多,我想自己做这些:

class Warrant(models.Model):
"""
"""
name = models.CharField(max_length=50)
WARRANT_TYPE_CHOICES = (
    ('ARREST', 'Arrest'),
    ('SEARCH', 'Search'),
)
warrant_type = models.CharField(max_length=10, choices=WARRANT_TYPE_CHOICES, default='ARREST')
start_date = models.DateTimeField(auto_now=True, null=True)
expiry_date = models.DateTimeField(auto_now_add=True, null=True)
renewal_date = models.DateTimeField(auto_now_add=True, null=True)

如您所见,相当简单的模型。

以下是我目前漫无目的地摆弄的测试:

def test_model_creation(self):
    object = Warrant.objects.create()
    self.assertIsNotNone(object)

def test_warrant_str(self):
    warrant = Warrant.objects.create(
        name="Warrant Name",
    )
    self.assertEqual(str(warrant), "Warrant Name")

def test_datetime_model(self):
    start_date = Warrant.objects.create(start_date=datetime.now())
    expiry_date = Warrant.objects.create(expiry_date=datetime.now())
    renewal_date = Warrant.objects.create(renewal_date=datetime.now())

对我来说,这读起来很好,并且所有测试都返回 OK。但是,我不确定这是否是最佳实践,或者是否真的做了我认为应该做的事情。

此外,我也不确定如何测试warrant_type / WARRANT_TYPE_CHOICES 字段。

我知道这通常不是应该在这里问的问题类型,但我基本上只是随机输入我从教程中挑选出来的东西,甚至不知道它是否正确。

谢谢

标签: djangounit-testingdjango-modelsdjango-unittest

解决方案


我认为您的测试实际上并没有做任何有用的事情,但是有一种方法可以做我相信您正在寻找的东西。如果我想编写一个测试来确保模型正确地创建对象,我会做这样的事情:

from django.test import TestCase

class WarrantTestCase(TestCase):
    def setUp(self):
        self.warrant = Warrant.objects.create(name="Warrant Name", warrant_type="SEARCH")

    def test_warrant_create(self):
        warrant = Warrant.objects.get(name="Warrant Name")
        self.assertEqual(warrant.type, "SEARCH")

设置首先创建一个示例对象,然后我的测试抓取该对象并检查保证类型是否与我期望的相同。

有关 Django 单元测试的更多信息,请参见文档:https ://docs.djangoproject.com/en/3.1/topics/testing/overview/


推荐阅读