当前位置: 首页 > article >正文

Django中的第一个自动化测试编写

        跟着Django官网中的投票应用学习,其中有官方说明的一个bug:如果 Question 是在一天之内发布的,那么这个Question 应该显示“published_recently”,返回值为True ,然而现在如果问题发布时间为30天之后(未来时间),也会返回True,而我们期待的是返回值为False.

        那么根据测试的思想:应用中总是存在bug的,目的就是编写测试用例找出这些bug。现在已经知道bug是什么样,编写有效的测试用例来触发这个bug就好了。因为项目目前很简单,而且是第一个测试,就先简单写到一个test.py文件里面,但后面如果要规范化的话,还是应该在应用程序代码旁边创建一个tests目录,可以创建多个测试文件,把测试分为不同的子模块。

图中详细信息:

①polls/tests.py  我的投票应用名称叫做polls,测试是写在test.py文件中的。

②class QuestionModelTests(TestCase):  创建一个django.test.TestCase的子类,自动化测试运行会在该类中自动寻找以 test 开头的测试函数。

③ test_was_published_recently_with_future_question函数中三行代码创建了一个测试用例:将问题发布时间设为从现在开始的30 days之后,正确返回值应该为False.

④在终端中运行指令 python manage.py test polls,则会寻找polls路径下的测试代码,有1 test.

⑤Creating test database for alias 'default'... 需要数据库的测试不会使用实际项目中的数据库,而是会创建一个测试数据库,无论测试是否通过,所有测试执行完毕后测试数据库默认销毁(在一定条件下可以用命令在两次测试之间保留测试数据库,这样可以加快测试)。

⑥这个测试返回结果与预想的不一样,最后输出FAILED,destroying 测试数据库。

确定bug后定位到具体源码然后修复:

#before
def was_published_recently(self):
        now = timezone.now()
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

#after
def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

测试用例不变,执行测试。这次测试通过,输出OK.

还是这个published_recently问题,根据边界值分析的设计思路,可以再设计两个测试用例,一个Question发表时间为1 day 少1秒,一个发表时间为1day 多一秒。

def test_was_published_recently_with_old_question(self):
        """
        bug:一天以上发布的问题应该返回 False
        """
        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):
        """
        bug: 1天内发布的问题应该返回 True
        """
        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)

执行测试:

 最后贴一张Django文档中对于测试的观点:

 


http://www.kler.cn/a/288465.html

相关文章:

  • HTTP常见的状态码有哪些,都代表什么意思
  • 设计模式练习(一) 单例模式
  • Zotero 6.0 安装包及安装教程
  • JS 实现SSE通讯和了解SSE通讯
  • 11张思维导图带你快速学习java
  • C++,STL 054(24.11.13)
  • VS Code CMake tool 配置
  • Apple LLM: 智能基础语言模型(AFM)
  • Apache Struts2开发模式漏洞解析与修复
  • 温湿度传感器和IOT网关的连接 485接口
  • 嵌入式OTG硬件电路分析
  • 矩阵性质简介
  • 51单片机波特率的计算方法
  • kafka单条消息过大发送失败
  • CTF Show逆向4reserve wp--mingyue
  • 滑动窗口系列(不定长滑动窗口长度) 9/2
  • 09--kubernetes持久化存储和StatefulSet控制器
  • Ubuntu最新镜像下载,国内镜像源地址大全
  • RocketMQ集群搭建,及RocketMQ-Dashboard部署(前RocketMQ-Console)
  • vscode远程连接服务器并根据项目配置setting.json
  • 四、基本电路设计笔记——4.1 DC-DC稳压电路
  • 【Python123题库】#研究生录取数据分析A #图书数据分析(A)
  • 【算法每日一练及解题思路】判断数字是否为偶数
  • Vue实现步骤条(el-step)+Popover弹出框
  • Oracle 网络安全产品安全认证检索
  • 编程如何塑造我们的世界