mock 是辅助单元测试的模块,用于测试不方便调用的别人的接口。举个简单的例子,好比说,咱们测试django 写的微信登陆接口,正常流程下,咱们须要前端拉起受权窗口,获取jscode或其余数据。而这一部分操做,咱们在单元测试的时候没办法模拟出来。此时,咱们但愿假设调用微信的接口,正常返回了咱们须要的数据,在这种状况下,咱们便须要简单的mock 函数,假设已经该函数正常返回了咱们的结果,让流程更通畅。前端
代码demopython
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)
python本身带了一个单元测试框架,unittest,能够方便的实现测试环境初始化,测试用例编写(以test_开头,能自动执行 ),环境清除, 返回校验的功能,能够很方便的使用, 在这只作简单介绍。
在单元测试运行完以后,成功会打印一个".",失败会显示断言失败的地方。sql
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的单元测试是基于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完,数据库会被摧毁。django
Tips:api
在django的单元测试中,每次测试用例执行完,都会恢复数据库,因此咱们若是在一个用例中,修改了某个model的值,并不会影响后面的使用。bash
有时候,咱们指望的是在一个有数据的数据库里执行咱们的测试,因此,咱们能够加上 --keepdb
选项,这样在每次运行完以后, 数据库已有的数据仍是存在的。微信
咱们但愿跑单元测试的数据库是单独的一个,和线上分离,因此须要在数据库配置(settings.py 文件中) 指定session
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': '', 'USER': '', 'HOST':'', 'PASSWORD': '', 'PORT': '', 'TEST': {# 配置对应的测试数据库 'NAME': 'mdw_pre', } } }
在运行过程当中,可能会打印出一些项目的log 记录, 咱们能够经过app
-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
至此,咱们能够比较完整的编写咱们本身项目单元测试了