一、什麼是單元測試
單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。如果測試通過則說明我們這個函數或功能能夠正常工作,如果失敗要麼測試用例不正確,要麼函數有bug需要修復。
二、如何使用單元測試
from django.test import TestCase from app01.models import * class AuthorTestCase(TestCase): # 測試開始前的工作 def setUp(self): auths = Author.objects.all().values() print(auths) # 測試結束的收尾工作 def tearDown(self): Author.objects.filter(name="Steven").delete() auths = Author.objects.all().values() print(auths) # 自己定義的測試方法,必須以"test_"開頭 def test_insert_data(self): Author.objects.create(name="Steven", hobby="騎行") auths = Author.objects.all().values() print(auths) 輸出: <QuerySet []> <QuerySet [{'name': 'Steven', 'id': 1, 'hobby': '騎行'}]> <QuerySet []>
Django的單元測試實際是基於Python的unittest模塊,“setUp”方法是測試開始前的工作,“tearDown”方法是測試結束的收尾動作,這些方法名都是固定的,不允許隨意修改,裏面內容你也可以不寫直接“pass”。“test_insert_data”是我自己定義的測試內容,方法名必須以“test_”開頭,可以任意寫多個自定義測試方法。
Django單元測試注意點:
1. 對於每一個測試方法都會講setUp()和tearDown()方法執行一遍
2. Django會在數據庫中自動新建一個測試數據庫來進行數據庫方面的測試,默認在測試完成後銷燬。所以不用擔心它會影響你實際的生成數據庫!
三、運行單元測試
1. 測試項目中所有的應用
python3 manage.py test
2. 測試項目中單獨的應用
python3 manage.py test app01
3. 運行項目中某個應用的測試文件中的一個Case
python3 manage.py test app01.test2.AuthorTestCase
4. 運行項目中某個應用的測試文件中的一個Case中的其中一個測試方法
python3 manage.py test app01.test2.AuthorTestCase.test_insert_data
5. 運行單元測試結束時不自動刪除測試數據庫(保留測試數據庫)
python3 manage.py test app01 --keepdb
# 爲什麼要有這個呢?如果你有很多測試用例,定義了許多測試方法,那麼每次在做數據庫操作時都會創建數據庫、刪除數據庫,嚴重影響執行效率。這樣我們就保留測試數據庫,記得下次執行測試時也要帶上--keepdb,不然會提示你刪除上一次的測試數據庫
四、指定測試數據庫的字符集
這是我之前踩過的一個坑,之前用Pycharm寫過的一個項目執行測試沒有任何問題,過幾天重新打開執行單元測試,結果報了字符集錯誤,然後測試數據庫沒有自動刪除。我經過仔細排查,發現自動創建的測試數據庫字符集竟然是“latin1”,我數據庫表中有中文,所以直接報錯了。知道錯誤原因就好辦了,我查詢了官方文檔,在setting.py文件中強制設置測試數據庫字符集是“UTF8”。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'xxx', 'USER': 'xxx', 'PASSWORD': 'xxx', 'HOST': '', 'PORT': '', 'TEST': {'CHARSET': 'utf8', }, } }