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
```
- 至此,我們可以比較完整的編寫我們自己項目單元測試了