zoukankan      html  css  js  c++  java
  • 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只要跑一个测试用例就行了。

    -----

  • 相关阅读:
    开更
    PKUSC2016
    Educational Codeforces Round 12 E Beautiful Subarrays
    省选过了,又开始更新了。。。
    我来试试视频功能
    [BZOJ4407]于神之怒加强版
    bzoj3998: [TJOI2015]弦论
    bzoj4569: [Scoi2016]萌萌哒
    2016-5-30模拟测试
    2016-5-26模拟测试
  • 原文地址:https://www.cnblogs.com/JiangLe/p/8795447.html
Copyright © 2011-2022 走看看