title: Django單元測試總結
date: 2019/6/18 17:50:00
body: [article]
description: " 在本文中,筆者大體對Django單元測試的基本操做進行了介紹。在閱讀完本文後,讀者可以運用Django框架提供的單元測試的API對本身的程序編寫單元測試文件。"
category:python
在本文中,筆者大體對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.0django
Django框架爲單元測試基於Python的unittest包封裝了test模塊。經過繼承Django框架提供的測試模板,可以爲須要測試的方法或者類構造測試類。對於每個須要測試的的單元(類或方法)各自構造一個測試類,在每一個類中按照被測試單元的功能要求、錯誤處理要求等分別構造測試樣例以及相應的輔助方法。
以下段代碼所示,對於最基本的一個測試單元,須要有一個繼承模板、測試準備方法以及若干測試方法。json
# 引入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進行必定操做,產生預期中的錯誤。 # 。。。。。。 # 檢查錯誤處理的正確性 # 。。。。。。
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方法。api
# 引入客戶端模擬類 from Django.test import Client # 建立客戶端模擬對象 c = Client() # 客戶端發送請求 c.get('url')
Django的單元測試模板類繼承了CLient類。可以在構造單元測試類中直接調用Client類的相應方法。app
from Django.test import TestCase class TestUnit(TestCase): def test(self): # 調用自身的方法 self.get('url') pass
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框架提供了幾種斷言函數,用於對運行結果進行驗證,而且每一個模板類都包含了這些函數。post
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
的方式運行單元測試可以自動地獲取到被測試單元的覆蓋率。