1、什么是TDD:

  测试驱动开发(Test-Driven Development) 它的总体思想是在写“实现”之前先写针对实现的“测试”,由于编写测试的时候

  你要思考很多的可能性能,更多的思考也就意味着在写“实现”之前你已经对问题有了一个相对深入的理解,在“实现”完成

  后就可以用之前编写好测试用例来进行测试了。

  好处:1): 事前可以更清楚自己要解决的问题。 2):日后在你修改代码的时候你凭什么确定你的修改不会有问题呢?你只要运行

  一下你之前的测试用例看一下能不能跑通就行了。

  坏处:1):过于理想对程序员要求比较高。2):增大工作量。

2、100%的TDD过于理想:

  个人认为可能先完成功能“实现”,为尽可能多的“实现”编写测试用例,通过这些可以自动化执行的测试用例来保证代码的质量。

3、Django中一个TDD的例子:

  例子中会有一个叫Book的类用来保存“书”的相关信息,它有一个isReccent方法来判断这本书是不是最近出版本的

  整个django项目的结构大致如下:

./
├── db.sqlite3
├── manage.py
├── p2_7_1
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-.pyc
│   │   ├── settings.cpython-.pyc
│   │   └── urls.cpython-.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── polls
├── __init__.py
├── __pycache__
│   ├── __init__.cpython-.pyc
│   ├── admin.cpython-.pyc
│   ├── apps.cpython-.pyc
│   ├── models.cpython-.pyc
│   └── tests.cpython-.pyc
├── admin.py
├── apps.py
├── migrations
│   ├── 0001_initial.py
│   ├── 0002_book.py
│   ├── __init__.py
│   └── __pycache__
│   ├── 0001_initial.cpython-.pyc
│   ├── 0002_book.cpython-.pyc
│   └── __init__.cpython-.pyc
├── models.py
├── tests.py
└── views.py

  

  我在models.py 中定义了Book类内容如下

from django.db import models
from django.utils.timezone import now
import datetime
# Create your models here. class Book(models.Model):
publication_date=None def __init__(self,publication_date):
self.publication_date=publication_date def isRecent(self):
return self.publication_date >= now() - datetime.timedelta(days=100)

  

  tests.py文件中人内容如下

from django.test import TestCase
from django.utils.timezone import now
import datetime
from polls.models import Person
# Create your tests here. class BookModelTests(TestCase):
def test_isCurrent(self):
pub_time = now() + datetime.timedelta(days=30)
book = Book(publication_date=pub_time)
self.assertIs(book.isRecent(),False)

  也就是说我在BookModelTests中专门为Book的isRecent方法编写了测试用例,当一个出版时间指定为未来某一时间的情况下用来测试

  Book.isRecent方法是否完美的实现了功能

  运行测试用例

python3 manage.py test polls
Creating test database for alias 'default'...
System check identified no issues ( silenced).
E
======================================================================
ERROR: test_isCurrent (polls.tests.BookModelTests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/jianglexing/Desktop/django_2_learning/p2_7_1/polls/tests.py", line , in test_isCurrent
book = Book(publication_date=pub_time)
File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/django/db/models/base.py", line , in__init__
raise TypeError("'%s' is an invalid keyword argument for this function" % kwarg)
TypeError: 'publication_date' is an invalid keyword argument for this function ----------------------------------------------------------------------
Ran test in .002s FAILED (errors=)
Destroying test database for alias 'default'...

  测试用例没有跑通、也就是说我们发现了一个Book.isRecent方法中的一个逻辑错误,一本书的出版时间不应该是未来,

  然而我们的方法对这样的值没有免疫。

  修正Book.isRecent方法

from django.db import models
from django.utils.timezone import now
import datetime
# Create your models here. class Book(models.Model):
publication_date=None def __init__(self,publication_date):
self.publication_date=publication_date def isRecent(self):
return now() - datetime.timedelta(days=100) <= self.publication_date <=now()

  再次进行测试

 python3 manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.001s OK

总结:

  TDD的好处在于测试用例的代码只要编写一次、之后业务代码的变量有没有引发bug只要跑一个测试用例就行了。

-----

django-TDD的更多相关文章

  1. Django 1.6 的测试驱动开发

    http://www.oschina.net/translate/django-1-6-test-driven-development 测试驱动开发(TDD)是一个迭代的开发周期,强调编写实际代码之前 ...

  2. PYTHON TDD学习(一)-->Python 3.4版本环境安装Django及其启动

    1.安装Python3.4版本,原因:3.4及其以后版本默认自带pip工具,非常好用 2.django 安装命令(c:\Python34\Scripts):pip install django 3.s ...

  3. Django中Celery的实现介绍(一)

    Django中Celery的实现 Celery官网http://www.celeryproject.org/ 学习资料:http://docs.jinkan.org/docs/celery/ Cele ...

  4. django 的模板语言

    1.模版的执行 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户. def current_datetime(req ...

  5. 从celery rabbitmq with docker-compose 引出对容器、依赖注入、TDD的感悟

    用docker配置项目管理系统taiga的时候,不是我一个人遇到这个问题.https://github.com/douglasmiranda/docker-taiga/issues/5 问题描述: 用 ...

  6. Django 中的 csrf_token 与单元测试

    Django 中的 csrf_token 与单元测试 在<Python Web开发:测试驱动方法>一书中作者使用的 Django 版本是 1.7,而我使用的是1.9.7版(官网已经更新到1 ...

  7. Django学习系列18:使用迁移创建生产数据库

    Django生成一个很有帮助的错误信息,大意是说没有正确设置数据库. 你可能会有疑惑,为什么在单元测试一切都运行ok,这是因为Django为单元测试创建了专用的测试数据库——这是Django中Test ...

  8. Django学习系列11:在服务器中处理POST请求

    之前的代码还没有为表单指定action=属性,因此提交表单默认返回之前渲染的页面,即“/”,这个由视图函数home_page处理.下面修改这个视图函数,让它能处理POST请求. 这意味着要为视图函数h ...

  9. 异步任务队列Celery在Django中的使用

    前段时间在Django Web平台开发中,碰到一些请求执行的任务时间较长(几分钟),为了加快用户的响应时间,因此决定采用异步任务的方式在后台执行这些任务.在同事的指引下接触了Celery这个异步任务队 ...

  10. 《Django By Example》第四章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:祝大家新年快乐,这次带来<D ...

随机推荐

  1. ERROR - Undefined placeholders found in template:

    今天发现了一个BUG,在引用其他的包的的时候报错: ERROR - Undefined placeholders found in template: - Template: META-INF/aut ...

  2. 什么是Session分布式共享

    在了解session分布式共享之前先来了解Session.Redis和Nginx的相关知识. 一.Session相关知识 1.Session 介绍 Session在网络应用中,称为“会话控制”. 每个 ...

  3. Java Netty (1)

    Netty是由JBOSS提供的一个java开源框架,本质上也是NIO,是对NIO的封装,比NIO更加高级,功能更加强大.可以说发展的路线是IO->NIO->Netty. ServerBoo ...

  4. Python调用Windows外部程序

    在Python中可以方便地使用os模块运行其他的脚本或者程序,这样就可以在脚本中直接使用其他脚本,或者程序提供的功能,而不必再次编写实现该功能的代码.为了更好地控制运行的进程,可以使用win32pro ...

  5. TortoiseGit使用指南

    http://www.360doc.com/content/13/0424/17/9171956_280649187.shtml

  6. java面试第二天

    局部变量:不是声明在类体括号里面的变量 (1)必须要先赋值,后使用,否则通不过编译,局部变量没有默认初始化值 (2)作用范围:定义开始到定义它的代码块结束 (3)同一范围内,不允许2个局部变量命名冲突 ...

  7. 三分钟彻底禁用、隐藏Android设备底部虚拟按钮(亲测有效)

       转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/7613970.html Android设备屏幕底部一般都有虚拟导航栏,上面有 back.home等按钮. ...

  8. H5移动端JS操作LocalStorage方法

    LocalStorage和SessionStorage LocalStorage 是对Cookie的优化 没有时间限制的数据存储 在隐私模式下不可读取 大小限制在500万字符左右,各个浏览器不一致 在 ...

  9. Java ReEntrantLock 之 Condition条件(Java代码实战-002)

    import java.util.LinkedList; import java.util.concurrent.locks.Condition; import java.util.concurren ...

  10. 洛谷 P1736 创意吃鱼法

    题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...