Django学习系列5:为视图编写单元测试
打开lists/tests.py编写
- """向浏览器返回真正的HTML响应,添加一个新的测试方法"""
- from django.test import TestCase
- from django.urls import resolve
- from django.http import HttpRequest
- from lists.views import home_page
- class HomePageTest(TestCase):
- def test_root_url_to_home_page(self):
- found = resolve('/') # resolve是Django内部函数,用于解析URL,并将其映射到相应的视图函数上
- self.assertEqual(found.func, home_page) # 检查解析网站根路径/时,是否能找到home_page
- def test_home_page_returns_correct_html(self):
- request = HttpRequest() #
- response = home_page(request) #
- html = response.content.decode('utf8') #
- self.assertTrue(html.startswith('<html>')) #
- self.assertIn('<title>To-Do lists</title>', html) #
- self.assertTrue(html.endswith('</html>')) #
- """
- 代码解析:
- 1、我们创建了一个Httprequest对象,用户在浏览器请求网页时,Django看到的就是Httprequest请求
- 2、把这个HttpRequest对象传给home_page视图,得到响应,响应对象为 HttpResponse类的实例,响应的.content属性中有特定的内容
- 3、响应的.content这些原始字节将被发送到用户的浏览器,我们通过.decode()将它们转换后发送到用户
- 4、他以一个<html>标记开始,该标记在结尾处关闭
- 5、希望在中间的某一个地方有一个<title>标签,含to_do单词,这是我们在功能测试中指定的。
- """
- """
- 单元测试:
- 在终端执行# python manage.py test
- TypeError: home_page() takes 0 positional arguments but 1 was given
- """
以上代码在Django1.x版本和2.1版本运行情况相同。
保证编写的代码无误,每次改动的幅度就要尽量小。这样确保每一个部分有对应的测试监护。
如下改动lists/views.py:
- def home_page(request):
- pass
- 后运行测试
# python manage.py test
运行结果:
AttributeError: 'NoneType' object has no attribute 'content'
- 编写代码,使用Django.http.HttpResonse:
- from django.http import HttpResonse
- # Create your views here.在这儿编写视图
- def home_page(request):
- return HttpResonse()
- 运行测试:
self.assertTrue(html.startswith('<html>'))
AssertionError: False is not true
再次编写代码(只需要对比贴出代码中不同的地方)
- def home_page(request):
- return HttpResponse('<html>')
运行测试
- self.assertIn('<title>To-Do lists</title>', html) #
- AssertionError: '<title>To-Do lists</title>' not found in '<html>'
继续编写
- def home_page(request):
- return HttpResponse('<title>To-Do lists</title>')
运行测试
- self.assertTrue(html.startswith('<html>')) #
- AssertionError: False is not true
再次编写代码:
- def home_page(request):
- return HttpResponse('<html><title>To-Do lists</title></html>')
最后运行单元测试
- # python manage.py test
- Creating test database for alias 'default'...
- System check identified no issues (0 silenced).
- ..
- ----------------------------------------------------------------------
- Ran 2 tests in 0.001s
- OK
- Destroying test database for alias 'default'...
通过了。
最后启动开发服务器,运行以下功能测试
- 启动开发服务器
- python manage.py runserver
- 在终端另一个窗口运行功能测试
- python functional_tests.py
- 运行结果:
E
======================================================================
ERROR: test_page (__main__.NewVisitorTest)
...
失败了?原来时那个提醒。我们编写了一个网页。
提交一下版本
- $ git diff
- $ git commit -am "Basic view now returns minimal HTML"
查看进展(代码提交情况查询)
- (django) root@ranxf-TEST:/studydisk/Python_web_TDD/superlists# git log --oneline
- c7a30e6 Basic view now returns minimal HTML
- dc3d118 First unit test and url mapping, dummy view —— 第一个单元测试和url映射,虚拟视图
- bf4ae39 add app for lists, with failing unit test
- 966ff4b "使用注释编写规格的首个功能测试,而且使用unitest"
- be3f27e 第一次提交和基本的Django配置
小结
前面学习到的内容:
- 新建Django应用(Starting a Django app)
- django的单元测试运行(The Django unit test runner )
- 功能测试和单元测试的区别(The difference between FTs and unit tests )
- Django解析URL的方法,urls.py文件的作用(Django URL resolving and urls.py)
- Django的视图函数,请求和响应对象(Django view functions, request and response objects)
- 如何返回简单的HTML( returning basic HTML)
有用的命令和概念
- 启动开发服务器python manage.py runserver
- 运行功能测试python functional_tests.py
- 运行单元测试python manage.py test
- 单元测试/编写代码循环
Django学习系列5:为视图编写单元测试的更多相关文章
- Django学习系列之Form基础
Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...
- Django学习系列4:编写第一个简单的应用代码
首页视图编写 lists/tests.py from django.test import TestCasefrom django.urls import resolvefrom lists.view ...
- Django学习系列6:使用selenium测试用户交互
学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...
- ABP入门系列(11)——编写单元测试
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 前言 In computer programming, unit testing is a ...
- Django 学习之Rest Framework 视图相关
drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...
- Django学习系列10:保存用户输入——编写表单,发送POST请求
要获取用户输入的待办事项,发送给服务器,这样才能使用某种方式保存待办事项,然后在显示给用户查看. 上次运行测试指出无法保存用户的输入.现在,要使用HTML post请求. 若想让浏览器发送POST请求 ...
- Django学习系列17:在模板中渲染待办事项
前面提到的问题中在表格中显示多个待办事项 是最后一个容易解决的问题.要编写一个新单元测试,检查模板是否也能显示多个待办事项: lists/tests.py def test_displays_all_ ...
- Django学习系列16:处理完POST请求后重定向
处理完POST请求后重定向 代码中new_item_text = ''的写法不怎么样.解决第二个问题时候,顺带把这个问题也解决了. 人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧.修 ...
- Django学习系列15:把POST请求中的数据存入数据库
要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...
随机推荐
- 浏览器端-W3School-HTML:HTML DOM Select 对象
ylbtech-浏览器端-W3School-HTML:HTML DOM Select 对象 1.返回顶部 1. HTML DOM Select 对象 Select 对象 Select 对象代表 HTM ...
- [Flask]常用过滤器-控制字符串
truncate: 字符串截断 <p>{{ 'hello every one' | truncate(9)}}</p> length:获取列表长度 <p>{{ [, ...
- ControlTemplate in WPF —— ListBox
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...
- Java学习之==>int和Integer的区别和联系
一.区别 1.类型 int是java中原始八种基本数据类型之一: Integer是一个类,包装整型提供了很多日常的操作: 2.存储位置和大小 int是由jvm底层提供,由Java虚拟机规范,int型数 ...
- Elasticsearch 6.2.3版本 Windows环境 简单操作
背景描述 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...
- Oracle 无备份情况下的恢复--临时文件/在线重做日志/ORA-00205
13.5 恢复临时文件 临时文件没有也不应该备份.通过V$TEMPFILE可以找到所有的临时文件. 此类文件的损坏会造成需要使用临时表空间的命令执行失败,不至于造成实例崩溃或session中断.由于临 ...
- Object Creation
Although using the object constructor or an object literal are convenient ways to create single obje ...
- leaflet的入门开发(一)
2016年9月27日—1.0leaflet,最快的,最稳定和严谨的leaflet,终于出来了! leaflet是领先的开源JavaScript库为移动设备设计的互动地图.重33 KB的JS,所有映射大 ...
- CTF—WEB—sql注入之宽字节注入
宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...
- python+selenium下载文件——Chrome
from selenium import webdriver import time options = webdriver.ChromeOptions() prefs = { 'profile.de ...