Django单元测试

你离开我真会死。 提交于 2019-12-02 18:10:41

更多技术资讯可关注:gzitcast

mock 测试
ock 是辅助单元测试的模块,用于测试不方便调用的别人的接口。举个简单的例子,比如说,我们测试django 写的微信登录接口,正常流程下,我们需要前端拉起授权窗口,获取jscode或其他数据。而这一部分操作,我们在单元测试的时候没办法模拟出来。此时,我们希望假设调用微信的接口,正常返回了我们需要的数据,在这种情况下,我们便需要简单的mock 函数,假设已经该函数正常返回了我们的结果,让流程更通畅。
代码demo:
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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_开头,能自动执行 ),环境清除, 返回校验的功能,可以很方便的使用, 在这只做简单介绍。
在单元测试运行完之后,成功会打印一个".",失败会显示断言失败的地方。

代码demo
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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,可以方便我们发出请求,使用用法如下, 我们可以根据自己接口的实际情况,编写相对应的单元测试代码,检查我们的接口是否正常返回

[Python] 纯文本查看 复制代码
1
2
3
4
5
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完,数据库会被摧毁。
注意:
      1 在django的单元测试中,每次测试用例执行完,都会恢复数据库,所以我们如果在一个用例中,修改了某个model的值,并不会影响后面的使用。
      2 有时候,我们期望的是在一个有数据的数据库里执行我们的测试,所以,我们可以加上 --keepdb 选项,这样在每次运行完之后, 数据库已有的数据还是存在的。
      3 我们希望跑单元测试的数据库是单独的一个,和线上分离,所以需要在数据库配置(settings.py 文件中) 指定
[Python] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
DATABASES = {
  'default': {
      'ENGINE': 'django.db.backends.postgresql',
      'NAME': '',
      'USER': '',
      'HOST':'',
      'PASSWORD': '',
      'PORT': '',
      'TEST': {# 配置对应的测试数据库
          'NAME': 'mdw_pre',
      }
  }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!