打开lists/tests.py编写

  1. """向浏览器返回真正的HTML响应,添加一个新的测试方法"""
  2.  
  3. from django.test import TestCase
  4. from django.urls import resolve
  5. from django.http import HttpRequest
  6.  
  7. from lists.views import home_page
  8.  
  9. class HomePageTest(TestCase):
  10.  
  11. def test_root_url_to_home_page(self):
  12. found = resolve('/') # resolve是Django内部函数,用于解析URL,并将其映射到相应的视图函数上
  13. self.assertEqual(found.func, home_page) # 检查解析网站根路径/时,是否能找到home_page
  14.  
  15. def test_home_page_returns_correct_html(self):
  16. request = HttpRequest() #
  17. response = home_page(request) #
  18. html = response.content.decode('utf8') #
  19. self.assertTrue(html.startswith('<html>')) #
  20. self.assertIn('<title>To-Do lists</title>', html) #
  21. self.assertTrue(html.endswith('</html>')) #
  22.  
  23. """
  24. 代码解析:
  25. 1、我们创建了一个Httprequest对象,用户在浏览器请求网页时,Django看到的就是Httprequest请求
  26. 2、把这个HttpRequest对象传给home_page视图,得到响应,响应对象为 HttpResponse类的实例,响应的.content属性中有特定的内容
  27. 3、响应的.content这些原始字节将被发送到用户的浏览器,我们通过.decode()将它们转换后发送到用户
  28. 4、他以一个<html>标记开始,该标记在结尾处关闭
  29. 5、希望在中间的某一个地方有一个<title>标签,含to_do单词,这是我们在功能测试中指定的。
  30. """
  31. """
  32. 单元测试:
  33. 在终端执行# python manage.py test
  34. TypeError: home_page() takes 0 positional arguments but 1 was given
  35. """

以上代码在Django1.x版本和2.1版本运行情况相同。

保证编写的代码无误,每次改动的幅度就要尽量小。这样确保每一个部分有对应的测试监护。

如下改动lists/views.py:

  1. def home_page(request):
  2. pass
  3.  
  4. 后运行测试
    # python manage.py test
    运行结果:
    AttributeError: 'NoneType' object has no attribute 'content'
  1. 编写代码,使用Django.http.HttpResonse:
  2.  
  3. from django.http import HttpResonse
  4.  
  5. # Create your views here.在这儿编写视图
  6. def home_page(request):
  7. return HttpResonse()
  8.  
  9. 运行测试:
    self.assertTrue(html.startswith('<html>'))
    AssertionError: False is not true

再次编写代码(只需要对比贴出代码中不同的地方)

  1. def home_page(request):
  2. return HttpResponse('<html>')

运行测试

  1. self.assertIn('<title>To-Do lists</title>', html) #
  2. AssertionError: '<title>To-Do lists</title>' not found in '<html>'

继续编写

  1. def home_page(request):
  2. return HttpResponse('<title>To-Do lists</title>')

运行测试

  1. self.assertTrue(html.startswith('<html>')) #
  2. AssertionError: False is not true

再次编写代码:

  1. def home_page(request):
  2. return HttpResponse('<html><title>To-Do lists</title></html>')

最后运行单元测试

  1. # python manage.py test
  2. Creating test database for alias 'default'...
  3. System check identified no issues (0 silenced).
  4. ..
  5. ----------------------------------------------------------------------
  6. Ran 2 tests in 0.001s
  7.  
  8. OK
  9. Destroying test database for alias 'default'...

通过了。

最后启动开发服务器,运行以下功能测试

  1. 启动开发服务器
  2. python manage.py runserver
  3.  
  4. 在终端另一个窗口运行功能测试
  5. python functional_tests.py
  6.  
  7. 运行结果:
    E
    ======================================================================
    ERROR: test_page (__main__.NewVisitorTest)
    ...

失败了?原来时那个提醒。我们编写了一个网页。

提交一下版本

  1. $ git diff
  2. $ git commit -am "Basic view now returns minimal HTML"

查看进展(代码提交情况查询)

  1. (django) root@ranxf-TEST:/studydisk/Python_web_TDD/superlists# git log --oneline
  2. c7a30e6 Basic view now returns minimal HTML
  3. dc3d118 First unit test and url mapping, dummy view —— 第一个单元测试和url映射,虚拟视图
  4. bf4ae39 add app for lists, with failing unit test
  5. 966ff4b "使用注释编写规格的首个功能测试,而且使用unitest"
  6. be3f27e 第一次提交和基本的Django配置

小结

前面学习到的内容:

  1. 新建Django应用(Starting a Django app)
  2. django的单元测试运行(The Django unit test runner )
  3. 功能测试和单元测试的区别(The difference between FTs and unit tests )
  4. Django解析URL的方法,urls.py文件的作用(Django URL resolving and urls.py)
  5. Django的视图函数,请求和响应对象(Django view functions, request and response objects)
  6. 如何返回简单的HTML( returning basic HTML)

有用的命令和概念

  1. 启动开发服务器python manage.py runserver
  2. 运行功能测试python functional_tests.py
  3. 运行单元测试python manage.py test
  4. 单元测试/编写代码循环

Django学习系列5:为视图编写单元测试的更多相关文章

  1. Django学习系列之Form基础

     Django学习系列之Form基础 2015-05-15 07:14:57 标签:form django 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追 ...

  2. Django学习系列4:编写第一个简单的应用代码

    首页视图编写 lists/tests.py from django.test import TestCasefrom django.urls import resolvefrom lists.view ...

  3. Django学习系列6:使用selenium测试用户交互

    学习系列5中的单元测试有报错信息,这儿来编写functional_tests.py文件,扩充其中的功能测试 # File: functional_test.py # Author: Rxf # Cre ...

  4. ABP入门系列(11)——编写单元测试

    ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 前言 In computer programming, unit testing is a ...

  5. Django 学习之Rest Framework 视图相关

    drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django REST ...

  6. Django学习系列10:保存用户输入——编写表单,发送POST请求

    要获取用户输入的待办事项,发送给服务器,这样才能使用某种方式保存待办事项,然后在显示给用户查看. 上次运行测试指出无法保存用户的输入.现在,要使用HTML post请求. 若想让浏览器发送POST请求 ...

  7. Django学习系列17:在模板中渲染待办事项

    前面提到的问题中在表格中显示多个待办事项 是最后一个容易解决的问题.要编写一个新单元测试,检查模板是否也能显示多个待办事项: lists/tests.py def test_displays_all_ ...

  8. Django学习系列16:处理完POST请求后重定向

    处理完POST请求后重定向 代码中new_item_text = ''的写法不怎么样.解决第二个问题时候,顺带把这个问题也解决了. 人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧.修 ...

  9. Django学习系列15:把POST请求中的数据存入数据库

    要修改针对首页中的POST请求的测试.希望视图把新添加的待办事项存入数据库,而不是直接传给响应. 为了测试这个操作,要在现有的测试方法test_can_save_a_post_request中添加3行 ...

随机推荐

  1. 浏览器端-W3School-HTML:HTML DOM Select 对象

    ylbtech-浏览器端-W3School-HTML:HTML DOM Select 对象 1.返回顶部 1. HTML DOM Select 对象 Select 对象 Select 对象代表 HTM ...

  2. [Flask]常用过滤器-控制字符串

    truncate: 字符串截断 <p>{{ 'hello every one' | truncate(9)}}</p> length:获取列表长度 <p>{{ [, ...

  3. ControlTemplate in WPF —— ListBox

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...

  4. Java学习之==>int和Integer的区别和联系

    一.区别 1.类型 int是java中原始八种基本数据类型之一: Integer是一个类,包装整型提供了很多日常的操作: 2.存储位置和大小 int是由jvm底层提供,由Java虚拟机规范,int型数 ...

  5. Elasticsearch 6.2.3版本 Windows环境 简单操作

    背景描述 Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库. El ...

  6. Oracle 无备份情况下的恢复--临时文件/在线重做日志/ORA-00205

    13.5 恢复临时文件 临时文件没有也不应该备份.通过V$TEMPFILE可以找到所有的临时文件. 此类文件的损坏会造成需要使用临时表空间的命令执行失败,不至于造成实例崩溃或session中断.由于临 ...

  7. Object Creation

    Although using the object constructor or an object literal are convenient ways to create single obje ...

  8. leaflet的入门开发(一)

    2016年9月27日—1.0leaflet,最快的,最稳定和严谨的leaflet,终于出来了! leaflet是领先的开源JavaScript库为移动设备设计的互动地图.重33 KB的JS,所有映射大 ...

  9. CTF—WEB—sql注入之宽字节注入

     宽字节注入 宽字节注入是利用mysql的一个特性,mysql在使用GBK编码(GBK就是常说的宽字节之一,实际上只有两字节)的时候,会认为两个字符是一个汉字(前一个ascii码要大于128,才到汉字 ...

  10. python+selenium下载文件——Chrome

    from selenium import webdriver import time options = webdriver.ChromeOptions() prefs = { 'profile.de ...