关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
不知大家是否有印象,利用命令行执行创建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,尝试测试驱动的开发模式。
shuangmuhu@gmail.com
安利一本专门讲Django的TDD的书,《python测试驱动开发》
2019-04-19 13:33 回复