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

目录
打赏
0
3
3
0
43
分享
相关文章
|
13天前
|
Java 项目实战之实际代码实现与测试调试全过程详解
本文详细讲解了Java项目的实战开发流程,涵盖项目创建、代码实现(如计算器与汉诺塔问题)、单元测试(使用JUnit)及调试技巧(如断点调试与异常排查),帮助开发者掌握从编码到测试调试的完整技能,提升Java开发实战能力。
130 0
Java 项目实战中现代技术栈下代码实现与测试调试的完整流程
本文介绍基于Java 17和Spring技术栈的现代化项目开发实践。项目采用Gradle构建工具,实现模块化DDD分层架构,结合Spring WebFlux开发响应式API,并应用Record、Sealed Class等新特性。测试策略涵盖JUnit单元测试和Testcontainers集成测试,通过JFR和OpenTelemetry实现性能监控。部署阶段采用Docker容器化和Kubernetes编排,同时展示异步处理和反应式编程的性能优化。整套方案体现了现代Java开发的最佳实践,包括代码实现、测试调试
67 0
Playwright 极速入门:1 小时搞定环境搭建与首个测试脚本
本文带你1小时快速入门Playwright,完成环境搭建并编写首个测试脚本。Playwright是微软推出的现代化Web自动化测试工具,支持Chromium、Firefox和WebKit三大浏览器引擎,具备跨平台、多语言(Python/JS/Java/C#)特性。其核心优势包括:智能自动等待机制减少失败率、内置录制工具实时生成脚本、多语言灵活选择,以及真移动端设备模拟能力,显著提升测试效率和可靠性。
自然语言生成代码一键搞定!Codex CLI:OpenAI开源终端AI编程助手,代码重构+测试全自动
Codex CLI是OpenAI推出的轻量级AI编程智能体,基于自然语言指令帮助开发者高效生成代码、执行文件操作和进行版本控制,支持代码生成、重构、测试及数据库迁移等功能。
495 0
自然语言生成代码一键搞定!Codex CLI:OpenAI开源终端AI编程助手,代码重构+测试全自动
Apipost自动化测试:零代码!3步搞定!
传统手动测试耗时低效且易遗漏,全球Top 10科技公司中90%已转向自动化测试。Apipost无需代码,三步实现全流程自动化测试,支持小白快速上手。功能涵盖接口测试、性能压测与数据驱动,并提供动态数据提取、CICD集成等优势,助力高效测试全场景覆盖。通过拖拽编排、一键CLI生成,无缝对接Jenkins、GitHub Actions,提升测试效率与准确性。
259 11
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
495 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
使用ChatGPT生成登录产品代码的测试用例和测试脚本
使用ChatGPT生成登录产品代码的测试用例和测试脚本
191 35
使用ChatGPT生成关于登录产品代码的单元测试代码
使用ChatGPT生成关于登录产品代码的单元测试代码
108 16
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
使用 BenchmarkDotNet 对 .NET 代码进行性能基准测试
174 13
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
218 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等