文档章节

Django part 5 ---Test

terry_hding
 terry_hding
发布于 2015/07/13 20:11
字数 1314
阅读 15
收藏 0
之前我的代码中是有bug的,贴出来看看
polls.models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date_published')

    def was_published_recently(self):
        #return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
    def __unicode__(self):
        return self.question_text
/////////////////////////////////////////////////////////////////////
was_published_recently()是为了判断这个问题是不是在昨天到今天新提出来的,如果是一天前的就不是最新的了
但是我没有考虑将来时,因此如果是一个月之后提出来的呢,同要是返回True,这就错了

增加测试文件进行测试

polls.test.py
from django.test import TestCase
from django.test.utils import setup_test_environment
import datetime
from django.utils import timezone
from polls.models import Question
from django.core.urlresolvers import reverse
from django.test import Client

class QuestionMethodTests(TestCase):
    def test_was_published_recently_with_future_question(self):

        time = timezone.now()+datetime.timedelta(days=30)                       //设定一个将来时
        future_question = Question(pub_date=time)                               //将来的问题实例化
        self.assertEqual(future_question.was_published_recently(),False)        //判断将来的问题不是最新的问题

    def test_was_published_recently_with_old_question(self):

        time = timezone.now() - datetime.timedelta(days=-30)                     //设定一个过去时
        old_question = Question(pub_date=time)                                   //过去的问题实例化
        self.assertEqual(old_question.was_published_recently(),False)            //判断过去的问题不是最新的

    def test_was_published_recently_with_recently_question(self):                

        time = timezone.now() - datetime.timedelta(hours=1)                      //设定一个现在时
        recent_question = Question(pub_date=time)                                //现在的问题实例化
        self.assertEqual(recent_question.was_published_recently(),True)          //现在的问题是最新的问题
/////////////////////////////////////////////////////////////////////////
C:\work\pycharm\mysite>python manage.py test polls
Creating test database for alias 'default'...
F
======================================================================
FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\work\pycharm\mysite\polls\tests.py", line 17, in test_was_published_recently_with_future
_question
    self.assertEqual(future_question.was_published_recently(),False)
AssertionError: True != False                                    //程序中返回的是True,与AssertionError中的False不一致提示错误

----------------------------------------------------------------------
Ran 1 test in 0.037s

FAILED (failures=1)
Destroying test database for alias 'default'...

C:\work\pycharm\mysite>python manage.py test polls
Creating test database for alias 'default'...

更改原程序,修改将来时这个bug

polls.models.py
class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date_published')

    def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1)<= self.pub_date<=now
    def __unicode__(self):
        return self.question_text
修改后再跑一次test, 程序中的值与assert所预判的值一致
/////////////////////////////////////////////////////////////////////////////////////
Creating test database for alias 'default'...
.
----------------------------------------------------------------------
Ran 3 test in 0.001s

OK
Destroying test database for alias 'default'...

测试可以在shell中进行

C:\work\pycharm\mysite>python manage.py shell
Python 2.7.8 (default, Jun 30 2014, 16:03:49) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.test.utils import setup_test_environment
>>> setup_test_environment()
>>> from django.test import Client
>>> client = Client()
>>> response = client.get('/')                                       //get url返回的东西
>>> response.status_code
404                                                                 //‘polls/’才有东西,光一个'/'是匹配不到url的
>>> from django.core.urlresolvers import reverse
>>> response = client.get(reverse('polls:index')                    // http://127.0.0.1/polls/index
... )
>>> response.content
'<!DOCTYPE html>\n<html lang="en">\n<head>\n    <meta charset="UTF-8">\n    <title>index</title>\n</head>\n<body>\n\n    <ul>\n        \n        <li><a href="/polls/1">what weather</a>\n        </li>\n            <li
><a href ="/polls/1/">what weather</a></li>\n        \n    </ul>\n\n</body>\n</html>'
>>> from polls.models import Question
>>> from django.utils import timezone
>>> q= Question(question_text="who is your favorite job", pub_date=timezone.now())  //创建一个question
>>> q.save()
>>> response=client.get('/polls/')
>>> response.context['latest_question_list']                     //render_to_response返回的变量
[<Question: who is your favorite job>, <Question: what weather>]
通过测试模块可以取出值来,就能进行比较和判断

在一个程序中测试文件写的越多越好,这样就可以避免bug外泄,分别对views中的index 和detail方法进行测试

polls.test.py
class QuestionViewTests(TestCase):
    def test_index_view_with_no_question(self):                                                      //测试如果没有问题的处理
        response = self.client.get(reverse('polls:index'))                                           //取得polls:index的响应
        self.assertEqual(response.status_code,200)                                                   //检查页面状态,没有question,页面仍然可以显示
        self.assertContains(response, "No polls are avaliable.")                                     //没有question, 响应中的内容应包含 ”No polls are avaliable“
        self.assertQuerysetEqual(response.context['latest_question_list'],[])                        //响应中的latest_question_list值应为0

    def test_index_view_with_a_past_question(self):                                                                 //测试问题是一个过去的question
        create_question(question_text="Past question.", days=-30)                                                   //创建一个一个月前的问题
        response = self.client.get(reverse('polls:index'))                                                          
        self.assertQuerysetEqual(response.context['latest_question_list'],['<Question: Past question.>'])           //检查最新的问题是一个过去的问题,虽然这个问题不是最新的,但是存在的,程序里是最新的5个,现在只有一个,所以有返回值

    def test_index_view_with_a_future_question(self):                                                //测试问题是一个将来的问题
        create_question(question_text="Future question.", days=30)                                   //创建一个一个月之后的问题
        response = self.client.get(reverse('polls:index'))                    
        self.assertContains(response,"No polls are avaliable.", status_code=200)                     //一个月这后的问题实际上是不存在的,页面应该显示”No polls are avaliable“
        self.assertQuerysetEqual(response.context['latest_question_list'],[])                        //检查此时最新的问题应该是空,不存在

    def test_index_view_with_future_question_and_past_question(self):                                           //同时测试将来和过去的问题
        create_question(question_text="Past question", days=-30)
        create_question(question_text="Future question", days=30)
        response = self.client.get(reverse('polls:index'))
        self.assertQuerysetEqual(response.context['latest_question_list'],['<Question: Past question>'])        //只能返回过去的问题,不能显示将来的问题

    def test_index_view_with_two_past_question(self):                                                           //同时测试两个过去的问题
        create_question(question_text="Past question 1", days=-30)
        create_question(question_text="Past question 2", days=-5)
        response = self.client.get(reverse('polls:index'))
        self.assertQuerysetEqual(response.context['latest_question_list'],['<Question:Past question 2>'],['<Question: Past question 1>'])        //显示时应该先显示2,再显示1, 因为question2比question1要新

class QuestionIndexDetailTests(TestCase):
    def test_detail_view_with_a_future_question(self):                                                         //对将来问题的内容进行测试
        future_question = create_question(question_text='Future question', days=5) 
        response = self.client.get(reverse('polls:detail', args=(future_question.id)))
        self.assertEqual(response.status_code,404)                                                             //因为没有将来的问题,所以页面出错

    def test_detail_view_with_a_past_question(self):                                                           //对过去问题的内容进行测试
        past_question = create_question(question_text='Past Question',days=-5)
        response = self.client.get(reverse('polls:detail',args=(past_question.id)))
        self.assertContains(response,past_question.question_text, status_code=200)                             //正常显示

通过这样的测试,可以测出程序中隐藏存在的问题,测试的内容想的越周到越好,测试的覆盖率越高越好,对每一个函数都要根据一定的测试方法进行测试




© 著作权归作者所有

terry_hding
粉丝 37
博文 133
码字总数 139248
作品 0
杨浦
QA/测试工程师
私信 提问
Django+uwsgi+nginx配置详解

操作系统是ubuntu 更新源 安装 Nginx 和 uWSGI 安装 Python 相关环境 这里如果安装不成功,可以分开安装,试过一次,分开安装才成功,原因目前以我的水平还发现不了,很遗憾。 安装 MySQL 安...

刀心
2015/08/05
0
0
python django web 管理界面admin工具简单部署

环境: A、centos 5.6 x64 B、python 2.7 C、django 1.6 1、创建一个项目 #python django-admin.py startproject test01 2、创建一个视图 #vim views.py #-- coding: utf-8 -- from django.h......

我不是三爷
2016/07/15
0
0
Python3和Django如何支持MySQL和MariaDB数据库

原文地址:http://www.server110.com/mariadb/201404/10020.html 首先,Django@Python2.x 中默认的引擎为 django.db.backends.mysql 。但是在Python3中如果这样写的话,会发现 django.db.ba...

湖北蒋文辉
2016/09/11
0
0
Djando多环境配置Redis+nginx

在root用户下配置遇到了很多问题,建议在linux 个人用户下配置,会减少很多麻烦。 Redis 1.nginx 安装 启动、停止、重启 OR ** 2.UWSGI 安装 **3.uWSGI和nginx部署Django web client < - > t...

人间四月
2016/09/28
29
0
django单元测试历险记

最近需要测试一个服务器端的django项目,查看了一下django的文档,发现django为了更加方便的对web应用进行测试,提供了一些便捷的测试方法。并且,专门有一篇文档讲诉如何测试django应用。 ...

科技小毛
2017/05/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

“旧城改造”的背后——银泰新零售阿里云解决方案(上)

相关免费课程《银泰新零售上云解决方案精讲》上线中 立足实战 讲透经典案例 助你快速理解新零售 第一节学习地址 第二节学习地址 传统线下商业体上云的案例 与其说银泰上云,倒不如说银泰“旧...

阿里云官方博客
4分钟前
0
0
记一次升级Oracle驱动引发的死锁

问题描述 近期项目需要从虚拟机环境迁移到容器环境,其中有一个项目在迁移到容器环境之后的两天之内出现了2次“死锁(deadlock)”的问题,部分关键日志如下: Found one Java-level deadlock:...

ksfzhaohui
6分钟前
0
0
MySQL 中的 information_schema 数据库

欢迎查看原文 - 本博客仅记录 https://blog.csdn.net/kikajack/article/details/80065753 -- 是否开启bin_log日志: off为关闭-- show variables like 'log_%'; show variables like '......

莫库什勒
14分钟前
0
0
Random在高并发下的缺陷以及JUC对其的优化

Random可以说是每个开发都知道,而且都用的很6的类,如果你说,你没有用过Random,也不知道Random是什么鬼,那么你也不会来到这个技术类型的社区,也看不到我的博客了。但并不是每个人都知道...

编程SHA
18分钟前
0
0
T5大牛带你解析:如何实现分布式技术

1.分布式事务 2. 分布式锁 Java 原生 API 虽然有并发锁,但并没有提供分布式锁的能力,所以针对分布式场景中的锁需要解决的方案。 分布式锁的解决方案大致有以下几种: 基于数据库实现 基于缓...

李红欧巴
30分钟前
31
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部