zoukankan      html  css  js  c++  java
  • Django 单元测试

    mock 测试

    mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口。举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或其他数据。而这一部分操作,我们在单元测试的时候没办法模拟出来。此时,我们希望假设调用微信的接口,正常返回了我们需要的数据,在这种情况下,我们便需要简单的mock 函数,假设已经该函数正常返回了我们的结果,让流程更通畅。

    代码demo

    from rest_framework.test import APITestCase
    from unittest import mock
    
    class AdviserTest(APITestCase):
        # mock.patch 中指定我们需要mock的函数路径(使用时的路径)
        @mock.patch("adviser.views.jscode2session")
        def test_small_app_login(self, mock_jscode2session):
            # 添加mock 函数的返回值,指定之后,所有的调用到该函数的地方,统一返回
            mock_jscode2session.return_value = {
                "openid": 123,"session_key":123
            }
            
            url = "/api/small_app_login/"
            data = {
    
                "jscode": "string",
                "name": "string",
                "avatar": "string",
                "gender": 0
    
            }
            ret = self.client.post(url, data=data)
            self.assertEqual(ret.status_code, 200)
    

    单元测试 unittest

    python自己带了一个单元测试框架,unittest,可以方便的实现测试环境初始化,测试用例编写(以test_开头,能自动执行 ),环境清除, 返回校验的功能,可以很方便的使用, 在这只做简单介绍。
    在单元测试运行完之后,成功会打印一个".",失败会显示断言失败的地方。

    import unittest
    
    class MyTest(unittest.TestCase):  # 继承unittest.TestCase
        def setUp(self):
            # 每个测试用例执行之前做操作
            print('22222')
    
        def tearDown(self):
            # 每个测试用例执行之后做操作
            print('111')
    
        @classmethod
        def tearDownClass(self):
        # 所有test运行完后运行一次
             print('4444444')
        @classmethod
        def setUpClass(self):
        # 所有test运行前运行一次
            print('33333')
    
        def run(self):
            print("00000") # 不是以test_开头,所以不会执行
        
        def test_a_run(self):
            self.assertEqual(1, 1)  # test_开头, 所以是测试用例
            
        def test_b_run(self):
            self.assertEqual(2, 2)  # test_开头, 所以是测试用例
            
    if __name__ == '__main__':
        unittest.main()#运行所有的测试用例
    

    django 单元测试框架

    django的单元测试是基于unittest 编写,所以整个流程和unittest的完全一致。
    为了方便使用django test 有一个client,可以方便我们发出请求,使用用法如下, 我们可以根据自己接口的实际情况,编写相对应的单元测试代码,检查我们的接口是否正常返回

    from django.test import Client
    c = Client()
    response = c.post('/login/', {'username': 'john', 'password': 'smith'})
    print(response.status_code)
    response = c.get('/customer/details/')
    

    在运行的时候,我们不在单独运行test文件,而是通过django的命令去启动测试 python manage.py test [app name] ,启动的时候,会根据已有的model 去创建新的test数据库,也就是说整个测试数据库初始的时候是空的,并且整个测试run完,数据库会被摧毁。

    Tips:

    • 在django的单元测试中,每次测试用例执行完,都会恢复数据库,所以我们如果在一个用例中,修改了某个model的值,并不会影响后面的使用。

    • 有时候,我们期望的是在一个有数据的数据库里执行我们的测试,所以,我们可以加上 --keepdb 选项,这样在每次运行完之后, 数据库已有的数据还是存在的。

    • 我们希望跑单元测试的数据库是单独的一个,和线上分离,所以需要在数据库配置(settings.py 文件中) 指定

      DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql',
            'NAME': '',
            'USER': '',
            'HOST':'',
            'PASSWORD': '',
            'PORT': '',
            'TEST': {# 配置对应的测试数据库
                'NAME': 'mdw_pre', 
            }
        }
      }
      
    • 在运行过程中,可能会打印出一些项目的log 记录, 我们可以通过

    -v {0,1,2,3}, --verbosity {0,1,2,3}
    Verbosity level; 0=minimal output, 1=normal output,
    2=verbose output, 3=very verbose output
    ```

    • 至此,我们可以比较完整的编写我们自己项目单元测试了
  • 相关阅读:
    java 微信公众服务平台 下发 模板消息
    java web实现 忘记密码(找回密码)功能及代码
    DES加密后get获取url参数无法解密问题
    java实现url转码、解码
    java 实现 DES加密 解密算法
    oracle sqlplus 导出csv文件
    oracle导出多CSV文件的靠谱的
    Oracle 释放过度使用的Undo表空间
    Archiving not possible: No primary destinations errors
    Linux 之 shell 比较运算符
  • 原文地址:https://www.cnblogs.com/yuzhenjie/p/10342501.html
Copyright © 2011-2022 走看看