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 自动化测试的视图测试。

相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
40 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
27天前
|
测试技术 持续交付 开发者
探索自动化测试的无限可能:从入门到精通
在软件开发领域,确保产品质量是至关重要的。自动化测试作为一种高效、可靠的测试方法,正逐渐成为行业标准。本文将带你深入了解自动化测试的世界,从基础概念到实践技巧,帮助你掌握这一强大的工具。无论你是初学者还是有经验的开发者,都能从中获得宝贵的知识和启发。
|
28天前
|
Java 测试技术 开发者
初学者入门:掌握单元测试的基础与实践
【10月更文挑战第14天】单元测试是一种软件测试方法,它验证软件中的最小可测试单元——通常是单独的函数或类——是否按预期工作。单元测试的目标是确保每个模块在其自身范围内正确无误地运行。这些测试应该独立于其他模块,并且应该能够反复执行而不受外部环境的影响。
50 2
|
1月前
|
机器学习/深度学习 人工智能 监控
提升软件质量的关键路径:高效测试策略与实践在软件开发的宇宙中,每一行代码都如同星辰般璀璨,而将这些星辰编织成星系的过程,则依赖于严谨而高效的测试策略。本文将引领读者探索软件测试的奥秘,揭示如何通过精心设计的测试方案,不仅提升软件的性能与稳定性,还能加速产品上市的步伐,最终实现质量与效率的双重飞跃。
在软件工程的浩瀚星海中,测试不仅是发现缺陷的放大镜,更是保障软件质量的坚固防线。本文旨在探讨一种高效且创新的软件测试策略框架,它融合了传统方法的精髓与现代技术的突破,旨在为软件开发团队提供一套系统化、可执行性强的测试指引。我们将从测试规划的起点出发,沿着测试设计、执行、反馈再到持续优化的轨迹,逐步展开论述。每一步都强调实用性与前瞻性相结合,确保测试活动能够紧跟软件开发的步伐,及时适应变化,有效应对各种挑战。
|
9天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
43 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
5天前
|
Java API 数据库
Django:从入门到精通
【11月更文挑战第18天】Django是一个由Python编写的高级Web应用框架,以其简洁性、安全性和高效性而闻名。Django最初由Adrian Holovaty和Simon Willison于2003年开发,旨在简化Web应用的开发过程。作为一个开放源代码项目,Django迅速吸引了大量的开发者和用户,成为了Python Web开发领域的重要工具之一。
13 1
|
5天前
|
Java 测试技术 Android开发
探索自动化测试的奥秘:从入门到精通
【10月更文挑战第37天】本文将带你进入自动化测试的世界,从基础知识到实战案例,逐步揭示自动化测试的神秘面纱。我们将一起探讨如何利用代码来简化测试过程,提高效率,并确保软件质量。无论你是初学者还是有经验的开发者,这篇文章都能为你提供有价值的见解和技巧。让我们一起踏上这段探索之旅吧!
|
10天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
1月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
170 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
1月前
|
存储 Shell 数据库
Python编程--Django入门:用户账户(二)
Python编程--Django入门:用户账户(二)