title: Django單元測試總結
date: 2019/6/18 17:50:00
body: [article]
description: " 在本文中,筆者大致對Django單元測試的基本操作進行了介紹。在閱讀完本文后,讀者能夠運用Django框架提供的單元測試的API對自己的程序編寫單元測試文件。"
category:
- 學習筆記
tags: - Django框架
- 單元測試
- Python
Django 單元測試總結
寫在前面
在本文中,筆者大致對Django單元測試的基本操作進行了介紹。在閱讀完本文后,讀者能夠運用Django框架提供的單元測試的API對自己的程序編寫單元測試文件。
此外,筆者開發的環境如下所示。
PyCharm 2019.1.1 (Professional Edition)
Build #PY-191.6605.12, built on April 3, 2019
JRE: 11.0.2+9-b159.34 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
單元測試基本結構
Django框架為單元測試基於Python的unittest包封裝了test模塊。通過繼承Django框架提供的測試模板,能夠為需要測試的方法或者類構造測試類。對於每一個需要測試的的單元(類或方法)各自構造一個測試類,在每個類中按照被測試單元的功能要求、錯誤處理要求等分別構造測試樣例以及相應的輔助方法。
如下段代碼所示,對於最基本的一個測試單元,需要有一個繼承模板、測試准備方法以及若干測試方法。
# 引入Django.test提供的測試模塊,這里選用的是TestCase類作為單元測試的模板。
from django.test import TestCase
# 引入測試需要的類或方法。
from Function.models import function
# 構造單元測試類,繼承相應的模板。
class TestUnit(TestCase):
def setUp(self):
# 測試前的准備工作:創建對象、數據庫環境等。
# 功能正確性測試
def test_function_successful(self):
# 使用被測試提供的類進行一定操作
# 。。。。。。
# 驗證操作后產生的結果
# 。。。。。。
# 錯誤處理測試
def test_function_dail(self):
# 使用被測試的API進行一定操作,產生預期中的錯誤。
# 。。。。。。
# 檢查錯誤處理的正確性
# 。。。。。。
單元測試API
測試模板類
Django框架為使用者提供了四種的測試模板,分別為TestCase、LiveServerTestCase、TransactionTestCase、SimpleTestCase。其中SimpleTestCase是Django框架中最基本的模板類是在unittest.TestCase類基礎上增加了部分功能構造的子類。在沒有數據庫操作時可使用該類作為測試模板。TransactionCase和TestCase在此基礎之上支持復雜的數據庫操作。一般情況下使用TestCase作為測試模板類。
在模板類中,除用於測試的樣例方法之外,使用者還可以重構框架提供的了幾種特殊的方法,用於做一些數據准備和銷毀的操作。
Function Name | Info |
---|---|
setUpClass | 在每個測試類建立時會被調用 |
tearDownClass | 在運行完測試類中每個樣例后被調用 |
setUp | 在執行每個測試樣例前被調用 |
tearDown | 在執行完每個測試樣例后被調用 |
setUpTestData | TestCase類的方法,類似於setUpClass,執行更快速 |
請求的發送
在Django.test模塊中定義了Client類用於在測試工程中模擬多種請求的發送。通過使用Client的對象中的不同方法並對相應的參數進行設置便能夠使用單元測試的請求發送功能。並且需要調用的方法與需要發送的請求有相同的名稱,比如發送Get請求時需要調用Client.get方法。
# 引入客戶端模擬類
from Django.test import Client
# 創建客戶端模擬對象
c = Client()
# 客戶端發送請求
c.get('url')
Django的單元測試模板類繼承了CLient類。能夠在構造單元測試類中直接調用Client類的相應方法。
from Django.test import TestCase
class TestUnit(TestCase):
def test(self):
# 調用自身的方法
self.get('url')
pass
Django支持的請求類型
Django測試模塊支持以下類型的請求。
請求類型 | 調用方法 |
---|---|
Post請求 | post(path, data=None, content_type=MULTIPART_CONTENT, follow=False, secure=False, **extra) |
Get請求 | get(path, data=None, follow=False, secure=False, **extra) |
Head請求 | head(path, data=None, follow=False, secure=False, **extra) |
Option請求 | options(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Put請求 | put(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Patch請求 | patch(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Delete請求 | delete(path, data='', content_type='application/octet-stream', follow=False, secure=False, **extra) |
Trace請求 | trace(path, follow=False, secure=False, **extra) |
常用參數含義
參數名 | 含義解釋 |
---|---|
path | 發送請求使用url |
data | 發送請求時攜帶的數據 |
content_type | 攜帶數據的格式 |
請求數據的接收與處理
通過Client對象發出的請求在經過被測試單元的一系列操作之后,返回的數據會以返回值的形式返回。一般情況下,后端返回的數據形式為json格式,在接收數據后需要調用json
方法進行解析。
c = Client()
response = c.get('/res/')
renponse = response.json()
# 此時response為字典格式的數據
結果的驗證
同其他單元測試類似,Django框架提供了幾種斷言函數,用於對運行結果進行驗證,並且每個模板類都包含了這些函數。
class TestUnit(TestCase):
def test(self):
self.assertEqual(a, b) # 檢驗a是否等於b
self.assertTrue(a)
self.assertFalse(b)
# ......
更多的斷言函數見官方模板的相應部分
單元測試的運行
運行單元測試
在Terminal中輸入以下指令即可運行單元測試文件。其中Module_name
為需要運行的模塊的名稱。
py manage.py test Module_name
覆蓋率的統計
筆者開發使用的IDE是PyCharm,其中自帶覆蓋率統計插件。以run with coverage
的方式運行單元測試能夠自動地獲取到被測試單元的覆蓋率。