Django测试驱动开发

  • 发布时间:2017年7月10日 15:36
  • 作者:杨仕航
  • 分类标签: Django
  • 阅读(7422)
  • 评论(1)

不知大家是否有印象,利用命令行执行创建Django app时:

Python manage.py startapp app_name


Django会自动生成一系列的文件,其中就有一个文件名为tests.py

相信很多人刚开始学Django的时候,会自动忽略该文件。认为该文件只是测试使用,无关紧要。于是立马开始打开models.py,写入相应的models。再注册该app和同步数据库等。

可否想过?一开始自动创建app自动生成的文件都是很有必要的。例如:admin.py、models.py、views.py。

既然tests.py文件与之并列,很显然是十分重要。建议对Django有个大概认识,可以写个简单的Django项目的人研究一下tests。

相关的test文档在Django文档也有很详细说明。可打开Django part5: Testing部分的文档仔细阅读。

看不懂英文或者想听我的感悟请继续往下看。


按照一般人理解,tests测试只是开发之后用于自动化测试的,仅仅是提高测试效率而已。实际不然,tests是一种开发驱动模式,叫测试驱动开发

先写好tests.py(当然这时的模型和方法等还未创建,先假设存在),将可能会的问题写下来。再根据这些问题开发实际的代码。开发完毕之后,再执行测试验证开发是否无误。

这种做法看似有些违背正常开发逻辑,但这只是表面现象。

它只是我们对系统构架用代码的方式写下来。正如我们写篇文章,tests相当于大纲。根据大纲开发可以把握开发方向。看似慢的行为,实际上却可以大大提高开发效率。


举个栗子,顺便通过本例讲解如何写tests。

假如我要写个博客,有个model叫Blog。我想给model写个方法判断该博客是否近期发布的(7天内)。按照正常逻辑发布日期永远小于等于今天。但日期只是一个数据,可以被修改。可能数据错乱了,可能日期被不小心修改了。发布日期可能大于今天。为了确保不出现这个bug。可以写个test测试该问题,后面开发该功能可以围绕该问题处理。打开app下的tests.py文件,写入如下代码:

#coding:utf-8
import datetime

from django.utils import timezone
from django.test import TestCase
from .models import Blog

class TestBlog(TestCase):
    def test_was_published_recently_with_future_question(self):
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Blog(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)


TestBlog继承TestCase类,每个def都是独立的测试内容。

其中,was_published_recently是假设用于判断博客是否近期发布的方法。

通过assertIs验证结果是否为我们期待的值。

我们再根据这个测试去开发实际的Blog和was_published_recently等。开发完毕之后,执行如下命令行进行test:

python manage.py test blog


使用test指令执行blog应用下的tests.py文件,也可指定其它的引用目录,例如apps.app_name。

不用担心test的时候会影响到现有的数据。所有的tests都是在测试数据库中进行。Django会自动创建测试数据库,测试完成之后,会自动删除测试数据库。

也无法使用现有的数据,因为测试数据库是新建的,空数据库。

而且每个def执行之后,都会清除数据。即每个def之间的数据互不影响。

通过tests代码,可以建议开发是否很够实现预期的目的。也可以通过开发检查tests是否书写正确。


那么,写测试有什么具体好处?总结如下:

1、测试可以节省时间

自动化测试,不用每次都手工执行测试代码或打开网页验证。每次开发新功能之后都可以执行一次自动化测试代码。


2、测试不仅可以检查错误,还可以预防错误

这个针对每次更新。有可能下次更新tests执行就出错了。而这些tests是上次测试通过的。说明新修改的代码有问题。而且通过查看tests代码,可以对整个Django项目的结构更加清晰。


3、测试可以让你的代码更容易被接受,有利于团队合作

国外有很多开发者,喜欢看有tests的代码。如果你在github有什么开源项目的话,有tests代码会让更多人参与开发。而且一个复杂的代码,有tests可以减少团队协作成员对设计的破坏。


Django创始人之一Jacob Kaplan-Moss,曾经说过:“Code without tests is broken by design.”。意思是:“没有测试的代码,设计上是有缺陷的。”

建议大家可以尝试写tests,尝试测试驱动的开发模式。


上一篇:Excel数组公式入门

下一篇:scp远程传输文件命令

评论列表

shuangmuhu@gmail.com

shuangmuhu@gmail.com

⁣安利一本专门讲Django的TDD的书,《python测试驱动开发》

2019-04-19 13:33 回复

新的评论

清空