django-TDD

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-36.pyc
│   │   ├── settings.cpython-36.pyc
│   │   └── urls.cpython-36.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── polls
    ├── __init__.py
    ├── __pycache__
    │   ├── __init__.cpython-36.pyc
    │   ├── admin.cpython-36.pyc
    │   ├── apps.cpython-36.pyc
    │   ├── models.cpython-36.pyc
    │   └── tests.cpython-36.pyc
    ├── admin.py
    ├── apps.py
    ├── migrations
    │   ├── 0001_initial.py
    │   ├── 0002_book.py
    │   ├── __init__.py
    │   └── __pycache__
    │       ├── 0001_initial.cpython-36.pyc
    │       ├── 0002_book.cpython-36.pyc
    │       └── __init__.cpython-36.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 (0 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 10, 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 495, 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 1 test in 0.002s

FAILED (errors=1)
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只要跑一个测试用例就行了。

 

 

-----

 

posted on 2018-04-11 14:21  蒋乐兴的技术随笔  阅读(423)  评论(0编辑  收藏  举报

导航