django-TDD
1、什么是TDD:
測試驅(qū)動開發(fā)(Test-Driven Development) 它的總體思想是在寫“實現(xiàn)”之前先寫針對實現(xiàn)的“測試”,由于編寫測試的時候
你要思考很多的可能性能,更多的思考也就意味著在寫“實現(xiàn)”之前你已經(jīng)對問題有了一個相對深入的理解,在“實現(xiàn)”完成
后就可以用之前編寫好測試用例來進(jìn)行測試了。
?
好處:1): 事前可以更清楚自己要解決的問題。 2):日后在你修改代碼的時候你憑什么確定你的修改不會有問題呢?你只要運行
一下你之前的測試用例看一下能不能跑通就行了。
?
壞處:1):過于理想對程序員要求比較高。2):增大工作量。?
?
2、100%的TDD過于理想:
個人認(rèn)為可能先完成功能“實現(xiàn)”,為盡可能多的“實現(xiàn)”編寫測試用例,通過這些可以自動化執(zhí)行的測試用例來保證代碼的質(zhì)量。
?
?
3、Django中一個TDD的例子:
例子中會有一個叫Book的類用來保存“書”的相關(guān)信息,它有一個isReccent方法來判斷這本書是不是最近出版本的
整個django項目的結(jié)構(gòu)大致如下:
./ ├── 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類內(nèi)容如下
from django.db import models from django.utils.timezone import now import datetime # Create your models here.class Book(models.Model):publication_date=Nonedef __init__(self,publication_date):self.publication_date=publication_datedef isRecent(self):return self.publication_date >= now() - datetime.timedelta(days=100)
tests.py文件中人內(nèi)容如下
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方法編寫了測試用例,當(dāng)一個出版時間指定為未來某一時間的情況下用來測試
Book.isRecent方法是否完美的實現(xiàn)了功能
?
運行測試用例
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_isCurrentbook = 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.002sFAILED (errors=1) Destroying test database for alias 'default'...測試用例沒有跑通、也就是說我們發(fā)現(xiàn)了一個Book.isRecent方法中的一個邏輯錯誤,一本書的出版時間不應(yīng)該是未來,
然而我們的方法對這樣的值沒有免疫。
?
修正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=Nonedef __init__(self,publication_date):self.publication_date=publication_datedef isRecent(self):return now() - datetime.timedelta(days=100) <= self.publication_date <=now()?
再次進(jìn)行測試
python3 manage.py test polls Creating test database for alias 'default'... System check identified no issues (0 silenced). . ---------------------------------------------------------------------- Ran 1 test in 0.001sOK?
?
?
總結(jié):
TDD的好處在于測試用例的代碼只要編寫一次、之后業(yè)務(wù)代碼的變量有沒有引發(fā)bug只要跑一個測試用例就行了。
?
?
-----
?
總結(jié)
以上是生活随笔為你收集整理的django-TDD的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: velocity模板引擎 -- java
- 下一篇: ERROR 1436 (HY000) a