Django中的單元測試怎麼寫?

2022-01-06 牛牛IT充電

Django 框架自帶了單元測試工具,利用該工具,我們可以方便地對單元進行錯誤檢查,以提高項目的質量。

在 Django 框架中,當新建一個應用時,會默認新建一個用於單元測試的 test.py 文件,我們的單元測試代碼就寫在 test.py 裡。

1、一個簡單的測試案例


在建立user應用,user應用中書寫一個測試案例:

from django.test import TestCase
def add(a,b): return a + b
if __name__ == '__main__': c = add(1,2) assert c == 3
c = add(1.0,2) assert c == 3.0
c = add(3,5) assert c == 9.0

右鍵點擊運行該test.py文件,用例不通過則會報錯:

但是,自己寫的斷言不好確定錯誤的原因,如果測試用例增多,操作麻煩。因此可以考慮使用測試框架。

 

2、使用unittest測試框架模塊


Unittest模塊的測試用例,默認必須以test_開頭,否則找不到用例,該用例不執行。

from django.test import TestCaseimport unittestdef add(a,b):    return a + b
class AddTest(unittest.TestCase): def test_init(self): self.assertEqual(add(1,2),3)
def test_float(self): self.assertEqual(add(1.0, 2), 3.0)
def test_err(self): self.assertEqual(add(3,5),9.0)
if __name__ == '__main__': unittest.main()

運行:

結果要比自己寫assert要清晰 

3、使用django內置的單元測試


Django.test中的TestCase其實是unittest的子類,因此在使用時,用例也必須以test_開頭,否則會出現找不到用例的情況。

from django.test import TestCasefrom .models import User
class simpleCase(TestCase): def setUp(self): User.objects.create(username='lili',password='123456',email='270108125@qq.com',is_active=False)
def test_model_add(self): user = User.objects.get(username='lili') self.assertIsNot(user,None)

在項目目錄下,運行:python manage.py test

將查詢用戶名改為:lili1,即查詢不到。添加測試用例test_model_add1

def test_model_add1(self):    user = User.objects.get(username='lili1')    self.assertIsNot(user,None)

 

用代碼訪問網址的方法:

from django.test import Clientc = Client()response = c.post('/login/', {'username': 'john', 'password': 'smith'})response.status_code
response = c.get('/customer/details/')response.content

測試登錄:

import hashlib
from django.test import TestCasefrom .models import Userfrom django.test import Client
class simpleCase(TestCase): def setUp(self): sha256 = hashlib.sha256() sha256.update('12345678'.encode('utf-8')) comparePwd = sha256.hexdigest() User.objects.create(username='lili',password=comparePwd,email='270108125@qq.com',is_active=False) self.client = Client()
def test_model_add(self): user = User.objects.get(username='lili') self.assertIsNot(user,None)
def test_get_login(self): response = self.client.get('/login/') self.assertEqual(response.status_code,200)
def test_post_login_1(self): self.client.post('/login/', {'user_name': 'lili', 'pwd': '12345678'}) sess = self.client.session.get('is_login', None) self.assertEqual(sess, 1)
def test_post_login_2(self): self.client.post('/login/', {'user_name': 'yuanyuan1', 'pwd': '12345678'}) sess = self.client.session.get('is_login', None) self.assertEqual(sess, None)

登錄視圖代碼:

def login(request):    if request.method == 'GET':        return render(request,'login.html')    else:        username = request.POST.get('user_name')        password = request.POST.get('pwd')        sha256 = hashlib.sha256()        sha256.update(password.encode('utf-8'))        comparePwd = sha256.hexdigest()
user = User.objects.filter(username=username,password=comparePwd)
if not user: print("1") return render(request, 'login.html', { 'errMsg': '用戶名和密碼不正確' }) else: print("0") request.session['is_login'] = 1 request.session['user_name'] = username return HttpResponseRedirect('/index/')

相關焦點

  • Python + Django 開發實戰(下)
    接下來談談日誌記錄,單元測試和程序調優和重構等內容。    這一篇要談的內容,也是開發中不可忽視的環節。 開發中日誌記錄能幫我們記錄信息定位問題;單元測試幫助我們在迭代開發過程及時發現問題,減少bug的引入; 而程序調優與重構,是一個永恆的話題。 日誌的重要性想必不用多說。 在我看來,日誌的作用主要有兩點:運營數據支撐。
  • 使用 Django 進行測試驅動開發
    (TDD),就是先編寫測試用例,然後編寫代碼來滿足測試用例,具體包含以下步驟:通常情況下,我們都是先寫代碼,然後編寫測試用例,因此測試驅動開發是反直覺的,那為什麼還要這麼做呢?基於以下幾點原因:TDD 可以被認為是根據測試用例來說明需求。此後編寫原始碼,重點是滿足這些要求。當測試最終通過時,你可以確信已滿足要求。這種專注可以幫助開發人員避免範圍蔓延。TDD 可以通過較短的開發周期提高開發效率。一次解決測試用例中的個別可以最大限度地減少幹擾因素。重大更改將更容易跟蹤和解決。減少了調試工作,提高了效率,並且將更多時間花在開發上。編寫測試時考慮到了需求。
  • Django官方為什麼沒有標準項目結構
    那我們該怎麼設計項目結構呢?在回答這個問題之前,先了解一下Django原生的目錄和文件都是幹嘛的。修改存放路徑,相關配置中的路徑也需要修改。admin.py存放Django自帶後臺管理的models。tests.py單元測試。views.py視圖函數(類)。
  • 一個完整的Django入門指南
    我們將從安裝、開發環境的準備,模型,視圖,模板,URL到更高級的主題(如遷移,測試和部署)中詳細探討所有基本概念。我想做一些不一樣的事情,這是一個容易學習,內容豐富且不失趣味的教程。我的想法是在文章中穿插一些漫畫的方式來演示說明相應的概念和場景。我希望大家能夠享受這種閱讀!當年我在一所大學擔任代課教授時,我曾經在計算機科學專業給新來的學生講授網絡開發學科。
  • python測試開發django-1.開始hello world!
    前言當你想走上測試開發之路,用python開發出一個web頁面的時候,需要找一個支持python語言的web框架。
  • Django的INSTALLED_APPS中應該寫app名,還是AppConfig子類?
    項目的配置信息我們一般寫在settings.py裡,那麼每個app對應的配置信息我們寫在哪裡? 答案是每個app目錄下的apps.py裡。與settings.py中以字符串形式配置相關信息不同,每個app的配置信息是通過繼承Django的AppConfig類實現的。
  • Python——用 Django 寫 restful api 接口
    用 Python 如何寫一個接口呢,首先得要有數據,可以用我們在網站上爬的數據,在上一篇文章中寫了如何用 Python 爬蟲,有興趣的可以看看:https://www.cnblogs.com/sixrain/p/9120529.html大量的數據保存到資料庫比較方便。
  • 如何寫好單元測試?
    單元測試(unit testing),指由開發人員對軟體中的最小可測試單元進行檢查和驗證。對於單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數,Java裡單元指一個類,圖形化的軟體中可以指一個窗口或一個菜單等。總的來說,單元就是人為規定的最小的被測功能模塊。
  • Django 中 REST API 的設計
    在Django中,不需要自己去設計每一個API,因為djangorestframwork幫我們做了一些工作。其實設計Django REST API的框架不少,但是djangorestframwork風格更像Django,與django的集成度更高,更易上手。該框架分為model, serializer, views三層,支持權限許可等功能。
  • django-admin和manage.py用法
    diffsettings 列出當前settings.py內容跟默認創建的settings.py有哪些改變,未出現在默認設置中的設置後跟"###"。fulsh Linux 下我們經常調侃,如果解決不了遇到的問題了,那就試試:rm -rf /(玩笑話,請勿實操) django 也有類型的命令:python manage.py flush,默認刪除default資料庫,如果setting.py中配置多個資料庫,可以指定:python manage.py flush --database DATABASEshowmigrations showmigrations
  • Django2.1文檔12-07:編寫你的第一個 Django 應用,第 5 部分
    寫一些自動測試並不能讓它工作的更好。如果寫一個投票應用是你想用 Django 完成的唯一工作,那你確實沒必要學寫測試。但是如果你還想寫更複雜的項目,現在就是學習測試寫法的最好時機了。測試將節約你的時間在某種程度上,能夠「判斷出代碼是否正常工作」的測試,就稱得上是個令人滿意的了。在更複雜的應用程式中,組件之間可能會有數十個複雜的交互。
  • Django實戰多語言
    ', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware
  • Django+Vue項目學習第一篇:django後臺搭建
    最近在學習Django和Vue,經過一段時間的摸索終於把前後端調通了,初步達到了學習的目的:  使用Vue寫前端頁面;  使用Django處理後臺邏輯,生成數據返給前端;  利用axios發送網絡請求,包含get請求、post請求、攜帶參數的請求; Django如何接收不同類型請求頭對應的請求參數,例如表單數據、json
  • .NET 項目中的單元測試
    .NET 項目中的單元測試Intro「不會寫單元測試的程式設計師不是合格的程式設計師,不寫單元測試的程式設計師不是優秀的工程師。」—— 一隻想要成為一個優秀程式設計師的渣逼程序猿。那麼問題來了,什麼是單元測試,如何做單元測試。
  • Web 前端單元測試到底要怎麼寫?看這一篇就夠了
    隨著 Web 應用的複雜程度越來越高,很多公司越來越重視前端單元測試。我們看到的大多數教程都會講單元測試的重要性、一些有代表性的測試框架 api 怎麼使用,但在實際項目中單元測試要怎麼下手?測試用例應該包含哪些具體內容呢?  本文從一個真實的應用場景出發,從設計模式、代碼結構來分析單元測試應該包含哪些內容,具體測試用例怎麼寫,希望看到的童鞋都能有所收穫。
  • 聊聊單元測試
    還有一種情況是,寫代碼的時候並沒有考慮這代碼要怎麼測,因此寫完了以後發現寫單元測試很難,沒有現成的測試入口。這時候項目交付的deadline又快到了,唉,要不先放著改天再寫吧。當然我們都知道,這個改天大概率再也不會做。我們有一萬個理由可以不做單元測試。但是這就好比,組裝一架飛機不用測試各個零件的運作是否符合預期,直接讓它飛起來再看有哪些問題。
  • Python Django之路與您同行
    主要在這裡寫下自己的學習筆記、軟體測試思考及讀書感悟等,後續可能會系統的介紹一些python、django、移動端自動化測試、接口自動化測試、性能測試等。歡迎您的光臨!要想深入測試,必須了解功能邏輯,對數據流及網站架構比較清楚,這點也說過多次,真的很重要,必須要體現在工作當中,養成習慣,絕對不要對自己測試過的功能模塊其中的技術實現不清楚。這樣測試路會不好走!!!
  • Jest 寫前端單元測試入門教程
    寫測試能減少 bug,提高代碼質量。同時,重構測試覆蓋率高的代碼,不擔心改壞以前的功能。前端的測試可以分為 3 類:單元測試,集成測試 和 UI 測試。單元測試是對軟體的最小單元進行測試。比如:一個函數,一個組件。集成測試,也叫組裝測試或聯合測試。
  • python測試開發django-76.ORM查詢之Q查詢
    >select * from yoyo_card where card_user = 'YOYO' or 'yoyo';filter() 查詢,查詢或關係MyDjango>python manage.py shell>>> from yoyo.models import Card>>> from django.db.models
  • django中遇到錯誤:Forbidden CSRF cookie not set
    表示django全局發送post請求均需要字符串驗證功能:防止跨站請求偽造的功能工作原理:客戶端訪問伺服器端,在伺服器端正常返回給客戶端數據的時候,而外返回給客戶端一段字符串,等到客戶端下次訪問伺服器端時,伺服器端會到客戶端查找先前返回的字符串