5、 測試

這里寫目錄標題

  • 1、自動化測試簡介
    • (1)自動化測試是什么
    • (2)為什么要寫測試
      • 測試節約你的時間
      • 發現錯誤,預防錯誤
      • 測試使得代碼更有吸引力
  • 2、基礎測試策略
  • 3、開始寫第一個測試
    • (1)首先得有個bug
    • (2)創建一個猜測來暴露這個bug
    • (3)運行測試
    • (4)修復這個bug
    • (5)更全面的測試
  • 4、測試視圖
    • (1)針對視圖的測試
    • (2)Django測試工具之Client
    • (3)改善視圖代碼
    • (4)測試新視圖
    • (5)測試DetailView
  • 5、當需要測試的時候,測試用例越多越好
  • 6、深入代碼測試

1、自動化測試簡介

(1)自動化測試是什么

測試在不同層次中都存在。有些測試關注很小的細節(函數返回值是否滿足預期),而另一些測試檢查對某個軟件的一系列操作(某一用戶屬兔序列是否造成了預期結果),我們使用shell來測試某一方法的功能,或者運行某個應用并輸入數據來檢查它的行為。
自動化測試是某個系統幫你完成的。當你創建好了一系列測試,每次修改應用代碼后,可以自動檢查出修改后的代碼是否還像預期那樣工作。而不需要花費大量時間手動測試。

(2)為什么要寫測試

對寫復雜項目有用

測試節約你的時間

手動測試浪費時間,要考慮大量數據,但是自動化測試能夠幫助我們在幾秒鐘內完成這件事情

發現錯誤,預防錯誤

測試能夠幫助我們清晰代碼的意圖

測試使得代碼更有吸引力

測試讓其他開發者知道你的代碼通過了測試

2、基礎測試策略

測試驅動——寫代碼之前寫測試

3、開始寫第一個測試

(1)首先得有個bug

現在我們就有一個bug
我們的要求是如果Question是在一天之內發布的,Question.was_published_recently()方法返回True,但是這個方法在Question的pub_date比這個時間還晚的情況下仍然返回True

py manage.py shell
>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # create a Question instance with pub_date 30 days in the future
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # was it published recently?
>>> future_question.was_published_recently()
True

在這里插入圖片描述
很明顯這是一個錯誤

(2)創建一個猜測來暴露這個bug

我們剛剛手動做的測試就是自動化測試應該做的工作
在 polls/tests.py 中編寫以下代碼

from django.test import TestCase
import datetime
from django.utils import timezone
from .models import Questionclass QuestionModelTests(TestCase):def test_was_published_recetly_with_future_question(self):time=timezone.now()+datetime.timedelta(days=30)future_question=Question(pub_date=time)self.assertIs(future_question.was_published_recently(),False)

解釋一下 assertis 的作用:

future_question.was_published_recently() 調用 was_published_recently 方法,返回一個布爾值。
self.assertIs(future_question.was_published_recently(), False) 斷言 future_question.was_published_recently() 的返回值是 False,即檢查 was_published_recently 方法的結果是否與 False 是同一個對象。
如果 was_published_recently() 返回 False,斷言通過;否則,斷言失敗,測試報告將顯示失敗的信息。

(3)運行測試

py manage.py test polls

在這里插入圖片描述
這個過程中發生了什么呢
在這里插入圖片描述

(4)修復這個bug

在 polls/models 中

    def was_published_recently(self):now=timezone.now()return now-datetime.timedelta(days=1) <= self.pub_date <= now

再次運行測試
在這里插入圖片描述
現在通過了測試,可以認為之后都不會出現這個錯誤了

(5)更全面的測試

在 tests.py 中增加

    def test_was_published_recently_with_old_question(self):time=timezone.now()-datetime.timedelta(days=1,seconds=1)old_question=Question(pub_date=time)self.assertIs((old_question.was_published_recently(),False))def test_was_published_recently_with_recent_question(self):time=timezone.now()-datetime.timedelta(hours=23,minutes=59,seconds=59)recent_question=Question(pub_time=time)self.assertIs(recent_question.was_published_recently(),True)

4、測試視圖

現在還有一個問題是 我們的polls應用對所有應用“一視同仁”,當pub_date為未來的某一天時,這個問題也照常發布,但是應該在未來的那個時刻發布才對

(1)針對視圖的測試

為了修復這個bug,我們這次先編寫測試,再去寫代碼,也就是“測試驅動”,其實這兩者的順序不是很重要

在開始之前先來看一下需要用到的工具

(2)Django測試工具之Client

dango提供了一個測試使用的Client 來模擬用戶和視圖層代碼的交互,我們能夠在 tests 以及 shell 中使用它

先從shell開始,要做一些在tests 中不是必須的工作:配置測試環境:
在這里插入圖片描述

(3)改善視圖代碼

我們創建一個未來的投票也會顯示,現在來修復這個問題

    def get_queryset(self):return Question.objects.filter(pub_date__lte=timezone.now()).order_by("-pub_date")[:5]

__lte 是 Django 查詢語法中的 “小于或等于”(less than or equal to)的表示方法。

(4)測試新視圖

def create_question(question_text,days):time=timezone.now()+datetime.timedelta(days=days)return Question.objects.create(question_text=question_text,pub_date=time)class QuestionIndexView(TestCase):def test_no_question(self):response=self.client.get(reverse("polls:index"))self.assertEqual(response.status_code,200)self.assertContains(response,"No polls are available.")self.assertQuerySetEqual(response.context["latest_question_list"],[])def test_past_question(self):question=create_question(question_text="Past question",days=-30)response=self.client.get(reverse("polls:index"))self.assertQuerySetEqual(response.context["latest_question_list"],[question],)def test_future_question(self):create_question(question_text="Future question.",days=30)response=self.client.get(reverse("polls:index"))self.assertContains(response,"No polls are available.")self.assertQuerySetEqual(response.context["latest_question_list"],[])def test_future_and_past_question(self):question=create_question(question_text="Past question.",days=-30)create_question(question_text="Future question.",days=30)response=self.client.get(reverse("polls:index"))self.assertQuerySetEqual(response.context["latest_question_list"],[question],)def test_two_past_questions(self):question1=create_question(question_text="Past question 1.",days=-30)question2=create_question(question_text="Past question 2.",days=-5)response=self.client.get(reverse("polls:index"))self.assertQuerySetEqual(response.context["latest_question_list"],[question1,question2])       

assertIs, assertEqual, assertContains, 和 assertQuerySetEqual 是 Django 測試框架中的一些常用斷言方法,用于在單元測試中進行各種類型的斷言
assertIs:作用:斷言兩個對象是同一個對象(即,兩個對象的引用是相同的)
assertEqual:作用:斷言兩個對象相等(即,兩個對象的值相等)。

測試就是假裝一些管理員的輸入,然后通過用戶端的表現是否符合預期來判斷加入的改變是否破壞了原有的系統狀態

(5)測試DetailView

對于未來的投票,如果用戶輸入了正確的url 還是可以訪問到它們,所以我們在DetailView里增加一些約束內容

polls.view.py

class DetailView(generic.DetailView):model = Questiontemplate_name = "polls/detail.html"def get_queryset(self):return Question.objects.filter(pub_date__lte=timezone.now())

test.py

class QuestionDetailViewTests(TestCase):def test_future_question(self):future_question=create_question(question_text="Future question.",days=5)url=reverse("polls:detail",args=(future_question.id,))response=self.client.get(url)self.assertEqual(response.status_code,404)def test_past_question(self):past_question=create_question(question_text="Past question.",days=-5)url=reverse("polls:detail",args=(past_question.id,))response=self.client.get(url)self.assertContains(response,past_question.question_text)

5、當需要測試的時候,測試用例越多越好

寫完測試就可以忘掉它啦,所以可以讓它肆意增長
對于測試有以下建議

  • 對每個模型、視圖建立單獨的 TestClass
  • 每個測試方法只測試一個功能
  • 給測試起直觀的名字

6、深入代碼測試

Django中的測試

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44875.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44875.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44875.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Not Invented Here 不是在這里發明的 / Proudly found elsewhere 自豪地在其他地方找到

注&#xff1a; 機翻&#xff0c;未校對。 兩篇關于創新管理的小文章 Not Invented Here 不是在這里發明的 In the history of organizational success, the enterprises that dominate tend to flawlessly execute on ideas that were created elsewhere. Examine just abo…

智慧水利解決方案:從理論到實踐的全面跨越,展示其在水資源管理、水災害預警、水生態保護等方面的創新應用

目錄 一、引言&#xff1a;智慧水利的時代背景與意義 二、智慧水利的理論框架與技術體系 1、理論框架 2、技術體系 三、智慧水利在水資源管理中的應用 1、水資源優化配置 2、水量水質協同管理 四、智慧水利在水災害預警中的應用 1、洪水預警與應急響應 2、干旱監測與評…

git 創建分支--命令行

在Git中創建分支是一個相對簡單且重要的操作&#xff0c;它允許開發者在不影響主代碼庫的情況下進行開發或修復工作。以下是創建Git分支的步驟&#xff1a; 一、基本步驟 打開命令行終端&#xff1a; 首先&#xff0c;需要打開命令行終端&#xff08;在Windows上可以是CMD、Po…

Mediapipe-姿態估計實例

Mediapipe簡介 Mediapipe 是由 Google Research 開發的一款開源框架&#xff0c;旨在幫助開發者輕松地構建、測試和部署復雜的多模態、多任務的機器學習模型。它特別擅長于實時處理和分析音頻、視頻等多媒體數據。以下是 Mediapipe 的一些關鍵特點和組件&#xff1a; 關鍵特點…

基于微信小程序的音樂播放平臺

基于微信小程序的音樂播放平臺 音樂播放小程序項目簡介技術棧功能模塊項目流程系統E-R圖項目頁面 音樂播放小程序 項目簡介 微信音樂小程序旨在提供一個簡潔高效的音樂播放平臺&#xff0c;用戶可以方便地搜索、播放和收藏自己喜歡的音樂。整個項目采用前后端分離的架構&…

WIN10開機突然,過一會就自動重啟藍屏DRIVER_IRQL_NOT_LESS_OR_EQUAL

環境&#xff1a; Win10 專業版 DELL7080 問題描述&#xff1a; WIN10開機突然&#xff0c;過一會就自動重啟藍屏DRIVER_IRQL_NOT_LESS_OR_EQUAL 事件日志 解決方案&#xff1a; 1.找到MEMORY.DMP文件內容&#xff0c;分析一下 Microsoft (R) Windows Debugger Version 10…

主機安全-開源HIDS字節跳動Elkeid安裝使用

目錄 概述什么是HIDSHIDS與NIDS的區別EDR、XDR是啥&#xff1f; Elkeid架構Elkeid Agent && Agent centerElkeid DriverElkeid RASPElkeid HUBService DiscoveryManager安裝數據采集規則&告警 參考 概述 什么是HIDS HIDS&#xff08; host-based intrusion detec…

使用Gitee倉庫鏡像管理功能實現Gitee與Github 雙向同步

進入你所需要同步的倉庫&#xff0c;點擊「管理」->「鏡像倉庫管理」&#xff0c;點擊「添加鏡像」選項&#xff1b; 如果你的Gitee賬號還沒有綁定過 GitHub 帳號&#xff0c;先根據彈窗的提示綁定 GitHub 帳號&#xff1b; 添加鏡像時候&#xff0c;在「鏡像方向」中選擇…

二次開發源碼 借貸系統uniapp/借貸認證系統/小額信貸系統/工薪貸APP/資金貸系統h5

前端&#xff1a;UNIAPP 后端&#xff1a;ThinkPHP 數據庫&#xff1a; Mysql 前端使用的uniapp 可以打包APP H5 小程序 系統提供了完善的網絡借貸體系&#xff0c;為金融中介平臺提供從獲客到貸后管理全流程服務&#xff0c;解決了借貸手續繁瑣、流程緩慢等問題 此源碼為運營…

ES6操作符使用總結

最近做新項目時候用到了ES6 添加的一些運算符&#xff0c;使用起來很方便&#xff0c;簡化了代碼&#xff0c;增強了代碼容錯性。使用感不錯&#xff0c;下面做了總結&#xff0c;本文也會持續維護。 1. !!props.useDefaultColor 這個技巧的作用是將任何 JavaScript 值轉換為…

管理Linux本地用戶和組

什么是用戶 用戶賬戶在可以運行命令的不同人員和程序之間提供安全界限。 在Linux系統中&#xff0c;系統通過分配唯一的標識號&#xff08;用戶ID或UID&#xff09;來區分不同的用戶帳戶。 在Linux系統中&#xff0c;用戶帳戶有以下三種主要類型&#xff1a; 超級用戶 負責…

分布式一致性算法:Raft學習

分布式一致性算法&#xff1a;Raft學習 1 什么是分布式系統&#xff1f; 分布式系統是由一組通過網絡進行通信、為了完成共同的任務而協調工作的計算機節點組成的系統。這些節點可能位于不同的物理位置&#xff0c;但它們協同工作以提供一個統一的計算平臺或服務。分布式系統…

對于復雜的數學模型,怎樣利用 MATLAB 的優化工具箱進行準確的參數估計和模型擬合?

要利用MATLAB的優化工具箱進行準確的參數估計和模型擬合&#xff0c;可以按照以下步驟進行&#xff1a; 定義模型&#xff1a;根據問題的需求和數學模型的形式&#xff0c;定義好模型的數學表達式。 收集數據&#xff1a;收集實際觀測數據&#xff0c;這些數據將用于擬合模型和…

Ubuntu linux安裝新版本go

加速網站&#xff1a;GOPROXY.IO - A Global Proxy for Go Modules 下載地址&#xff1a;All releases - The Go Programming Language Ubuntu jammy版本里面自帶的go版本較低&#xff0c;build ollama的時候報錯&#xff0c;于是升級go 升級操作 從上面下載地址找到自己需…

25秋招面試算法題 (Go版本)

文章目錄 科大訊飛 0713找01不能出現太多 科大訊飛 0713 找01 牛牛擁有一個長度為 n 的01 串&#xff0c;現在他想知道&#xff0c;對于每個字符&#xff0c;在它前面的最近的不同字符的下標是多少&#xff1f; 輸入描述 本題為多組測試數據&#xff0c;第一行輸入一個正整…

代碼隨想錄第五十五天打卡

42. 接雨水 接雨水這道題目是 面試中特別高頻的一道題&#xff0c;也是單調棧 應用的題目&#xff0c;大家好好做做。 建議是掌握 雙指針 和單調棧&#xff0c;因為在面試中 寫出單調棧可能 有點難度&#xff0c;但雙指針思路更直接一些。 在時間緊張的情況有&#xff0c;能寫出…

Unity中一鍵生成具有身體感知的虛擬人物動作

在虛擬現實(VR)和增強現實(AR)的浪潮中&#xff0c;如何讓虛擬人物的動作更加自然、真實&#xff0c;已經成為一個重要課題。AI4Animation項目&#xff0c;一個由 Sebastian Starke 主導的開源框架&#xff0c;為Unity開發者提供了強大的工具集&#xff0c;以實現這一目標。本文…

OrangePi AIpro在安防領域的深思和實戰(曠視科技CNN模型ShuffleNetV1開發案例測試)

一、前言 公司最近有個項目是安防領域的&#xff0c;主要用在邊緣結點&#xff0c;雖然已做成形&#xff0c;但是還是存在一些缺陷&#xff0c;例如&#xff1a;算力問題&#xff0c;開發板的成熟問題&#xff0c;已經各種技術的解決方案落地問題。目前我們集成了很多功能&…

Facebook 開源計算機視覺 (CV) 和 增強現實 (AR) 框架 Ocean

Ocean 是一個獨立于平臺的框架&#xff0c;支持所有主要操作系統&#xff0c;包括 iOS、Android、Quest、macOS、Windows 和 Linux。它旨在徹底改變計算機視覺和混合現實應用程序的開發。 Ocean 主要使用 C 編寫&#xff0c;包括計算機視覺、幾何、媒體處理、網絡和渲染&#x…

python中的pickle模塊和json模塊

目錄 pickle: Python 中的pickle 是一個內置模塊&#xff0c;用于序列化和反序列化 Python 對象結構。序列化是將對象轉換成字節流的過程&#xff0c;這樣對象就可以被存儲到文件中或者通過網絡傳輸。反序列化則是將這些字節流重新轉換成原始對象的過程。 json: json模塊是 …