zoukankan      html  css  js  c++  java
  • Django学习系列5:为视图编写单元测试

    打开lists/tests.py编写

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

    以上代码在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)  # 5
    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>'))  # 4
    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配置

     小结

    前面学习到的内容:

    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. 单元测试/编写代码循环
  • 相关阅读:
    求正整数N(N>1)的质因数的个数。
    手机键盘输入字母
    第二部分进度
    第一部分:地域维度标准化
    利用python解析地址经纬度
    输入任意4个字符(如:abcd), 并按反序输出(如:dcba)
    python-->微信支付
    python-图片流传输(url转换二维码)
    python-qrcode-二维码
    ajax和axios、fetch的区别
  • 原文地址:https://www.cnblogs.com/ranxf/p/11643233.html
Copyright © 2011-2022 走看看