Django 單元測試


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
```

  • 至此,我們可以比較完整的編寫我們自己項目單元測試了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM