Django单元测试

匿名 (未验证) 提交于 2019-12-03 00:02:01

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

复制代码
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

复制代码
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 # 继承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,可以方便我们发出请求,使用用法如下, 我们可以根据自己接口的实际情况,编写相对应的单元测试代码,检查我们的接口是否正常返回

复制代码
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/')



python manage.py test [app name]
启动的时候,会根据已有的model 去创建新的test数据库,也就是说整个测试数据库初始的时候是空的,并且整个测试run完,数据库会被摧毁。
注意:


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

复制代码
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',
}
}
}
更多技术资讯可关注:gzitcast
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!