django - 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 字段。
我知道这通常不是应该在这里问的问题类型,但我基本上只是随机输入我从教程中挑选出来的东西,甚至不知道它是否正确。
谢谢
解决方案
我认为您的测试实际上并没有做任何有用的事情,但是有一种方法可以做我相信您正在寻找的东西。如果我想编写一个测试来确保模型正确地创建对象,我会做这样的事情:
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/
推荐阅读
- python - 如何在没有 sympy 的情况下使用 python 找到符号导数?
- powershell - 在 PowerShell 中执行错误的 catch 块
- sql - 在 Oracle 中优化正则表达式
- java - @Autowired 不起作用
- bash - 为什么我的文件不是来自 bash 脚本?
- javascript - 显示所有标签内容 vanilla js
- java - Java 亲和锁
- c - 允许 ((int *)p)++ 的任何 gcc 选项
- grails - 为什么我不能在 Netbeans 8.2 中创建新的 grails 应用程序?
- java - 强制实现枚举的 Java 接口 - 如何处理?