Django测试入门:打造坚实代码基础的钥匙

简介: Django测试入门:打造坚实代码基础的钥匙

这一篇说一下 django 框架的自动化测试, django 自动化测试的不同之处在于,测试工作由系统完成。

我们只需创建一组测试,然后在对应用进行更改时,就可以检查代码是否仍按原计划运行,而无需执行耗时的手动测试。

基本测试策略

为了测试我们的代码,我们先定义一个错误,然后通过我们创建测试来暴露这个错误。

打开 members/model.py 文件,在 question 模型中添加判断发布日期方法,判断我们 question 的发布日期,小于24小时,例子如下:

from django.utils import timezone
from datetime import timedelta
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def was_published_recently(self):
        """
        Return True if the question was published recently (within the last day).
        """
        now = timezone.now()
        return now - timedelta(days=1) <= self.pub_date <= now

还记得我们的 djangoapi 命令行吗:

python manage.py shell

然后编写并执行调用 was_published_recently 方法的测试脚本

>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # create a Question instance with pub_date 30 days in the future
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # was it published recently?
>>> future_question.was_published_recently()

可以看到返回的是

image.png

这是我数据库保存的记录,最新一条距离当前时间不超过24小时,根据自身的环境做测试数据:

image.png

根据代码很明显,应用程序中有一个小bug,如果查询数据是在最近一天内发布的,该 question.was_published_recently() 方法将返回 true

但如查询数据是在在未来发布的(这种情况当然不可能当然不是),该方法也将返回 fasle

我们刚刚写的脚本测试其实就是自动化测试的一种,现在我们就将脚本测试完全转化为django自动化测试。

进入 members 目录,添加 test.py 文件,写入下面代码:

import datetime
from django.test import TestCase
from django.utils import timezone
from .models import Question
class QuestionModelTests(TestCase):
    def test_was_published_recently_with_future_question(self):
        """
        was_published_recently() returns False for questions whose pub_date
        is in the future.
        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), True)

然后进入项目根目录,进入 djangoapi 命令行:

python manage.py test members

image.png

通过编写自动测试方法,我们能很明确的看到是哪个测试失败了,失败发生在哪条线路上,

  • manage.py test members 会在应用程序中寻找测试
  • • 第二步 django.test.TestCase 先找到了该类的一个子类
  • • 第三步创建了一个特殊的数据库用于测试
  • • 第四步它寻找测试方法名称以 xxx 开头方法的 test ,其中 test_was_published_recently_with_future_question 创建了一个 question 实例,其 pub_date 字段为未来 30 天,并使用该 assertIs() 方法,
  • • 第五步发现它 was_published_recently() 返回了 False ,而我们希望它返回 True

我们来修复错误:打开 members/test.py ,将我们期望的 True 改成 False :

class QuestionModelTests(TestCase):
    def test_was_published_recently_with_future_question(self):
        """
        was_published_recently() returns False for questions whose pub_date
        is in the future.
        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

执行测试命令:

复制代码
python manage.py test members

得到下面返回结果:

image.png

测试通过。

如果想更全面的测试,我们向同一个类中添加两个测试方法,以更全面地测试该方法的行为

打开 members/test.py ,添加两个测试方法:

def test_was_published_recently_with_old_question(self):
    """
    was_published_recently() returns False for questions whose pub_date
    is older than 1 day.
    """
    time = timezone.now() - datetime.timedelta(days=1, seconds=1)
    old_question = Question(pub_date=time)
    self.assertIs(old_question.was_published_recently(), False)
def test_was_published_recently_with_recent_question(self):
    """
    was_published_recently() returns True for questions whose pub_date
    is within the last day.
    """
    time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
    recent_question = Question(pub_date=time)
    self.assertIs(recent_question.was_published_recently(), True)

执行测试命令:

python manage.py test members

得到下面返回结果:

image.png

可以看得出来,无我们的方法变得多么复杂,或者与什么其他代码交互,我们现在都可以保证我们编写测试的方法将按照预期的方式运行。

四、总结

这篇做完基础测试,印象中对 django 测试会有个基本概念。

基础测试只是基于方法的测试,适用于我们服务层的部分公共方法,逻辑方法和工具类。

下一篇我们会接着说一下 django 自动化测试的视图测试。

相关文章
|
5天前
|
SQL JavaScript 前端开发
基于Python访问Hive的pytest测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Python、来开发Hive应用的方法,产生的代码如下
22 6
基于Python访问Hive的pytest测试代码实现
|
1天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。
|
8天前
|
测试技术 UED
软件测试的艺术:从代码到品质的探索之旅
在数字时代的浪潮中,软件已成为我们生活和工作不可或缺的一部分。然而,高质量的软件背后隐藏着一门鲜为人知的艺术——软件测试。本文将带你走进这门艺术的世界,从基础理论到实践应用,一起探索如何通过软件测试保障产品质量,提升用户体验,并最终实现从代码到品质的华丽转变。
|
10天前
|
Web App开发 Java 测试技术
自动化测试的利器:Selenium WebDriver入门与实践
【9月更文挑战第8天】在软件开发的海洋中,测试是确保我们不会溺水的那根救生索。Selenium WebDriver,作为自动化测试的明星工具,让这根救生索更加结实可靠。本文将带你快速上手Selenium WebDriver,从基础设置到实际操作,再到实战演练,让你的开发之旅更加平稳顺畅。
|
5天前
|
SQL JavaScript 前端开发
基于Java访问Hive的JUnit5测试代码实现
根据《用Java、Python来开发Hive应用》一文,建立了使用Java、来开发Hive应用的方法,产生的代码如下
25 6
|
7天前
|
测试技术 持续交付
软件测试的艺术:从代码到信心的旅程
探索软件测试不仅仅是发现错误的技术过程,它是一场从编码到用户信心的转化之旅。本文将带你了解如何通过创造性思维和系统方法,将软件测试变成一门艺术,确保产品质量的同时,提升用户对技术的信赖。
24 4
|
10天前
|
人工智能 计算机视觉
AI计算机视觉笔记十五:编写检测的yolov5测试代码
该文为原创文章,如需转载,请注明出处。本文作者在成功运行 `detect.py` 后,因代码难以理解而编写了一个简易测试程序,用于加载YOLOv5模型并检测图像中的对象,特别是“人”类目标。代码实现了从摄像头或图片读取帧、进行颜色转换,并利用YOLOv5进行推理,最后将检测框和置信度绘制在输出图像上,并保存为 `result.jpg`。如果缺少某些模块,可使用 `pip install` 安装。如涉及版权问题或需获取完整代码,请联系作者。
|
15天前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到信心的旅程
在数字时代的浪潮中,软件成为我们日常生活和工作不可或缺的一部分。然而,高质量的软件背后隐藏着一群默默无闻的英雄——软件测试工程师。本文将带你一探究竟,软件测试不仅仅是找出错误的技术活动,它更是一门确保产品质量、提升用户信心的艺术。我们将从测试的重要性出发,探索不同的测试类型,深入理解测试用例的设计,并讨论如何通过持续集成和自动化测试来提高效率。无论你是软件开发者还是对软件质量感兴趣的读者,这篇文章都将为你提供新的视角和深入的洞见。
|
18天前
|
测试技术 C# 开发者
“代码守护者:详解WPF开发中的单元测试策略与实践——从选择测试框架到编写模拟对象,全方位保障你的应用程序质量”
【8月更文挑战第31天】单元测试是确保软件质量的关键实践,尤其在复杂的WPF应用中更为重要。通过为每个小模块编写独立测试用例,可以验证代码的功能正确性并在早期发现错误。本文将介绍如何在WPF项目中引入单元测试,并通过具体示例演示其实施过程。首先选择合适的测试框架如NUnit或xUnit.net,并利用Moq模拟框架隔离外部依赖。接着,通过一个简单的WPF应用程序示例,展示如何模拟`IUserRepository`接口并验证`MainViewModel`加载用户数据的正确性。这有助于确保代码质量和未来的重构与扩展。
27 0
|
18天前
|
测试技术 Go 开发者
掌握Golang测试:从入门到实践
【8月更文挑战第31天】
26 0