• 十二、Django_test


    一、概述

    不同的项目类型里面的单元测试基本不同

    二、测试项目分析

    1、models.py页面:模型页面

    1.1、tests.py文件里面写入case

    from django.test import TestCase
    from sign.models import Event,Guest   #导入引用的模块
    # Create your tests here.
    
    class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法
    
        def test_event(self):  #创建测试类
            Event.objects.create(id=1, name="oneplus 3 event", status=True, limit=2000,
                                 address='shenzhen', start_time='2016-08-31 02:18:22')   #数据初始化,创建一条发布会数据来提供后面进行查找
            results =  Event.objects.all()  #调用,并不是真正的去查找相对应的数据,需要在前面先创建发布会的字段才可以查找到
            print(results)
    

     1.2、终端进入到相对应的目录,并且使用Test方法运行脚本

     monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
    Creating test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    System check identified no issues (0 silenced).
    <QuerySet [<Event: oneplus 3 event>]>
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.005s
    
    OK
    Destroying test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    

     1.3、运行原理

    跟上面的unittest原理一样

    先找代码中有没有继承Django中Test下面的TestCase类

    再查找定义的方法中是否有test开头的方法,如果有的话就执行

    case运行的先后顺序为:通过ASCII码的排序进行排序运行

    初始化的数据并不会到数据库里面,只是提供测试操作

    1.4、case的断言操作

    tests.py文件

    from django.test import TestCase
    from sign.models import Event,Guest   #导入引用的模块
    # Create your tests here.
    
    class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法
    
        def test_event(self):  #创建测试类
            Event.objects.create(id=1, name="test1", status=True, limit=2000,
                                 address='shenzhen', start_time='2016-08-31 02:18:22')   #初始化测试数据,供下面查询使用,这条数据并不会直接到数据库里面,只是提供测试查询需要
            results =  Event.objects.get(name = 'test1')  #查询相对应的方式不会真正的去数据库查询数据,需要通过上面的方法创建数据
            print(results.limit)
            print(results.address)
            self.assertEqual(results.limit,2000)  #断言查询出来的数据是否limit =  2000
            self.assertEqual(results.address,'shenzhen')   #断言查询出来的数据 是否address = 'shenzhen'
    

    终端运行结果

     monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
    Creating test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    System check identified no issues (0 silenced).
    2000
    shenzhen
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.004s
    
    OK
    Destroying test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    

     1.5、使用setUp()、tearDown()

    tests.py文件

    from django.test import TestCase
    from sign.models import Event,Guest   #导入引用的模块
    # Create your tests here.
    
    class ModelsTest(TestCase): #创建测试类,继承Django下面的TestCase方法
    
        def setUp(self):
            #初始化发布会数据
            Event.objects.create(id=1, name="test1", status=True, limit=2000,
                                 address='shenzhen', start_time='2016-08-31 02:18:22')
            #初始化嘉宾表数据
            Guest.objects.create(id=2, event_id=1, realname='alen',
                                 phone='13711001101', email='alen@mail.com', sign=False)
    
        #发布会的case
        def test_event(self):
            results =Event.objects.get(name = 'test1')
            print(results.limit)
            print(results.address)
            self.assertEqual(results.limit,2000)
            self.assertEqual(results.address,'shenzhen')
    
        #嘉宾表的case
        def test_guest(self):
            results =Guest.objects.get(realname= 'alen')
            self.assertEqual(results.phone,'13711001101')
            self.assertEqual(results.email,'alen@mail.com')
    

     终端页面

     monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
    Creating test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    System check identified no issues (0 silenced).
    2000
    shenzhen
    ..
    ----------------------------------------------------------------------
    Ran 2 tests in 0.010s
    
    OK
    Destroying test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    

    2、views.py页面:视图页面

    2.1、初始化测试环境

    终端进入shell模式

    导入Client类,模拟post、get请求,加入路径,如果返回码为200则表示成功,建立了测试环境

    monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py shell
    Python 3.6.3 (default, Oct 17 2017, 00:27:06)
    [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin
    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类
    >>> c = Client()
    >>> response = c.get("/index/")    #类似于模拟界面自动化测试的方法,加入相对应的跳转后缀,模拟index页面登录效果
    >>> response.status_code   #获取返回码
    200

     2.2、测试case编写

    index页面登录case编写

    class TestIndex(TestCase):
    
        def test_idex(self):
            respose = self.client.get('/index/')
            print(respose.status_code)
    

     运行结果

     monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
    Creating test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    System check identified no issues (0 silenced).
    200
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.017s
    
    OK
    Destroying test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    

     2.3、断言判断

    class TestIndex(TestCase):
    
        def test_idex(self):
            respose = self.client.get('/index/')
            self.assertEqual(respose.status_code,200)   #断言状态码是否为200
            self.assertTemplateUsed(respose,'new_index.html')  #断言模板是否可用
            # print(respose.status_code)
    

     运行结果

     monkey@MacBook-Pro-7 � /usr/local/lib/python3.6/site-packages/guest � python3 manage.py test
    Creating test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    System check identified no issues (0 silenced).
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.018s
    
    OK
    Destroying test database for alias 'default'...
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.
      result = self._query(query)
    /usr/local/lib/python3.6/site-packages/pymysql/cursors.py:161: Warning: Changing sql mode 'NO_AUTO_CREATE_USER' is deprecated. It will be removed in a future release.
      result = self._query(query)
    

     2.4、登录case编写

    from django.test import TestCase
    from sign.models import Event,Guest   #导入引用的模块
    from django.contrib.auth.models import User   #导入用户表(在写登录单元测试case的时候需要创建一个用户来测试
    
    
    class LoginActionTest(TestCase):
    
        def setUp(self):
            '''
            初始化测试数据:创建一个新的用户(与model层的初始化发布会、嘉宾表数据一样)
            :return:
            '''
            User.objects.create_user('admin','admin@mail.com','admin123456')
    
        def test_add_author_email(self):
            '''
            添加测试用户
            :return:
            '''
            user = User.objects.get(username='admin')
            self.assertEqual(user.username,'admin')
            self.assertEqual(user.email,'admin@mail.com')
        
        def test_login_action_username_password_null(self):
            '''
            用户名、密码为空
            :return:
            '''
            response = self.client.post('/login_action/',{'input_username':'','input_password':''})
            self.assertEqual(response.status_code,200)
            self.assertIn(b'username or password error!',response.content)  #返回整个登录页面信息
    
    
        def test_login_action_username_password_error(self):
            '''
            用户名、密码错误
            :return:
            '''
            test_data = {'username':'abc','password':'123'}
            response = self.c.post('/login_action/',data = test_data)
            self.assertEqual(response.status_code,200)
            self.assertIn(b'username or password error!',response.content)
    
        def test_login_action_success(self):
            '''
            登录成功
            :return:
            '''
            test_data = {'username':'admin','password':'admin123456'}
            response = self.c.post('/login_actiom/',data = test_data)
            self.assertEqual(response.status_code,302)
    

    3、templates(模板)

    只是一个HTML页面,不能进行测试,如果HTML页面有JS代码(script)可以进行测试

    4、单独执行相对应的接口

    python3 manage.py test sign
    
    python3 manage.py test sign.tests.TestIndex
    

     

  • 相关阅读:
    C语言I博客作业02
    C语言I博客作业06
    C语言I—2019秋作业第一周作业
    C语言I博客作业09
    C语言I博客作业07
    C语言I博客作业08
    利用 jrebel 热部署\远程调试\远程热部署 springboot项目 服务器上的代码
    java 双因素认证(2FA)TOTP demo
    java File读取文件始终不存在的问题分析
    exchange 2010 的两个错误
  • 原文地址:https://www.cnblogs.com/little-turtle/p/7895922.html
Copyright © 2020-2023  润新知