Django之單元測試

一、什麼是單元測試

    單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。如果測試通過則說明我們這個函數或功能能夠正常工作,如果失敗要麼測試用例不正確,要麼函數有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', },
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章