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
至此,咱們能夠比較完整的編寫咱們本身項目單元測試了