Django 單元測試

mock 測試

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)

單元測試 unittest

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 單元測試框架

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

相關文章
相關標籤/搜索