python基礎8 單元測試

通過前面的7個章節,作者學習了python的各項基礎知識,也學習了python的編譯和執行。但在實際環境上,我們需要驗證我們的代碼功能符合我們的設計預期,所以需要結合python的單元測試類,編寫單元測試代碼。

Python有一個內置的unittest模塊,我們可以使用它來進行單元測試。

基礎用法

基本流程:

  1. 新建類,繼承自unittest.TestCase
  2. 類的成員函數統一用test_開頭,否則會無法識別和執行
  3. 通過調用unittest.main()來執行測試用例

簡單的示例程序如下:

import unittest#新建類,繼承自unittest.TestCase
#類的成員函數統一用test_開頭,否則會無法識別和執行
#通過調用unittest.main()來執行測試用例class TestMath(unittest.TestCase):def test_add(self):self.assertEqual(1 + 1, 2)def test_subtract(self):self.assertEqual(3 - 2, 1)if __name__ == '__main__':unittest.main()

結果輸出如下:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOK

測試函數和類方法

對函數的單元測試:

import unittest#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2class TestMath(unittest.TestCase):def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)if __name__ == '__main__':unittest.main()

結果輸出:

..
----------------------------------------------------------------------
Ran 2 tests in 0.000sOK

對類的單元測試:

在下面示例中,我們對函數和復用的Car類同時進行了單元測試。

import unittest#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2#復用前期定義的Car類
class Car(object):__slots__ = ('_color', '_number')@propertydef color(self):return self._color@color.setterdef color(self,value):self._color = value@propertydef number(self):return self._number@number.setterdef number(self,value):self._number = value@number.deleterdef number(self):print('oops! number is deleted!')def func(self):print('car number: %d' %  self._number)passclass TestAll(unittest.TestCase):def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)def test_car_color(self):car = Car()car.color ="blue"self.assertEqual(car.color, "blue")#屬性測試def test_car_property(self):car = Car()with self.assertRaises(AttributeError):value = car.engineif __name__ == '__main__':unittest.main()

結果輸出:?

....
----------------------------------------------------------------------
Ran 4 tests in 0.000sOK

測試套件和測試運行器

繼承自unittest.TestCase的類,用test_開頭的成員函數,可以稱為一個測試用例。

使用測試套件的方法,可以自由的執行這些測試用例。如執行先后次序,部分執行等。

示例代碼如下:

import unittest#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2#復用前期定義的Car類
class Car(object):__slots__ = ('_color', '_number')@propertydef color(self):return self._color@color.setterdef color(self,value):self._color = value@propertydef number(self):return self._number@number.setterdef number(self,value):self._number = value@number.deleterdef number(self):print('oops! number is deleted!')def func(self):print('car number: %d' %  self._number)passclass TestAll(unittest.TestCase):def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)def test_car_color(self):car = Car()car.color ="blue"self.assertEqual(car.color, "blue")#屬性測試def test_car_property(self):car = Car()with self.assertRaises(AttributeError):value = car.engineif __name__ == '__main__':# 創建測試套件suite = unittest.TestSuite()suite.addTest(TestAll('test_add'))#suite.addTest(TestAll('test_subtract'))suite.addTest(TestAll('test_car_property'))# 創建測試運行器runner = unittest.TextTestRunner()runner.run(suite) # 通過執行結果,我們可以看到僅執行了我們添加的兩個測試用例

測試準備和清理

很多時候,我們在測試用例執行之前,需要做一些準備操作,如執行數據庫相關測試用例之前,需要進行數據庫連接;之后需要斷開數據庫連接。這種場景下,我們需要使用python單元測試類默認的setUp和tearDown方法。修改上面的代碼,并測試。

import unittest#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2#復用前期定義的Car類
class Car(object):__slots__ = ('_color', '_number')@propertydef color(self):return self._color@color.setterdef color(self,value):self._color = value@propertydef number(self):return self._number@number.setterdef number(self,value):self._number = value@number.deleterdef number(self):print('oops! number is deleted!')def func(self):print('car number: %d' %  self._number)passclass TestAll(unittest.TestCase):def setUp(self):# 準備工作print("準備工作完成")def tearDown(self):# 結束后的工作print("結束清理工作完成")def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)def test_car_color(self):car = Car()car.color ="blue"self.assertEqual(car.color, "blue")#屬性測試def test_car_property(self):car = Car()with self.assertRaises(AttributeError):value = car.engineif __name__ == '__main__':# 創建測試套件suite = unittest.TestSuite()suite.addTest(TestAll('test_add'))#suite.addTest(TestAll('test_subtract'))suite.addTest(TestAll('test_car_property'))# 創建測試運行器runner = unittest.TextTestRunner()runner.run(suite)

結果輸出:

準備工作完成
結束清理工作完成
.準備工作完成
結束清理工作完成
.
----------------------------------------------------------------------
Ran 2 tests in 0.001sOK

高級測試用法

條件測試

可以使用@unittest.skip關鍵字,來表示測試用例只有在滿足特定條件下才執行。下面的示例中,我們使用關鍵字實現了一直跳過和條件跳過的功能。

@unittest.skip(reason)?

Unconditionally skip the decorated test.?reason?should describe why the test is being skipped.

無條件跳過,需要輸入填過的原因。

   @unittest.skip("Always skip!")

@unittest.skipIf(condition,?reason)

Skip the decorated test if?condition?is true.

條件滿足時跳過。

@unittest.skipIf(mylib.__version__ < (1, 3),"not supported in this library version")

@unittest.skipUnless(condition,?reason)

Skip the decorated test unless?condition?is true.

除此條件外,跳過。

    @unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")

@unittest.expectedFailure

Mark the test as an expected failure or error. If the test fails or errors in the test function itself (rather than in one of the?test fixture?methods) then it will be considered a success. If the test passes, it will be considered a failure.

失敗時,測試用例返回成功。

    @unittest.expectedFailuredef test_fail(self):self.assertEqual(1, 0, "failed test")

exception?unittest.SkipTest(reason)

This exception is raised to skip a test.

import unittest
import sys#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2#復用前期定義的Car類
class Car(object):__slots__ = ('_color', '_number')@propertydef color(self):return self._color@color.setterdef color(self,value):self._color = value@propertydef number(self):return self._number@number.setterdef number(self,value):self._number = value@number.deleterdef number(self):print('oops! number is deleted!')def func(self):print('car number: %d' %  self._number)passclass TestAll(unittest.TestCase):def setUp(self):# 準備工作print("準備工作完成")def tearDown(self):# 結束后的工作print("結束清理工作完成")@unittest.skip("啊!我被永久的跳過了")def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)# windows系統下,執行此測試用例。還可以使用版本號版本等等@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)def test_car_color(self):car = Car()car.color ="blue"self.assertEqual(car.color, "blue")#屬性測試def test_car_property(self):car = Car()with self.assertRaises(AttributeError):value = car.engineif __name__ == '__main__':# 創建測試套件suite = unittest.TestSuite()suite.addTest(TestAll('test_add'))suite.addTest(TestAll('test_subtract'))suite.addTest(TestAll('test_car_property'))# 創建測試運行器runner = unittest.TextTestRunner()runner.run(suite)

結果輸出:

準備工作完成
結束清理工作完成
.準備工作完成
結束清理工作完成
.
----------------------------------------------------------------------
Ran 3 tests in 0.001sOK (skipped=1)

模擬對象

Python的unittest.mock模塊提供了一種創建模擬對象的方法,我們可以用它來模擬外部的、不可控的因素。

import unittest
import sys
import datetime
#使用mock需要執行此引用
from unittest.mock import patch#定義測試用的函數
def add(v1,v2):return v1+v2def subtract(v1,v2):return v1-v2#復用前期定義的Car類
class Car(object):__slots__ = ('_color', '_number')@propertydef color(self):return self._color@color.setterdef color(self,value):self._color = value@propertydef number(self):return self._number@number.setterdef number(self,value):self._number = value@number.deleterdef number(self):print('oops! number is deleted!')def func(self):print('car number: %d' %  self._number)def say(self):current_hour = datetime.datetime.now().hourif current_hour < 12:return "Good morning!"elif current_hour < 18:return "Good afternoon!"else:return "Good evening!"passclass TestAll(unittest.TestCase):def setUp(self):# 準備工作print("準備工作完成")def tearDown(self):# 結束后的工作print("結束清理工作完成")@unittest.skip("啊!我被永久的跳過了")def test_add(self):#測試用例實現對函數的調用self.assertEqual(add(1, 1), 2)# windows系統下,執行此測試用例。還可以使用版本號版本等等@unittest.skipUnless(sys.platform.startswith("win"), "requires Windows")def test_subtract(self):#測試用例實現對函數的調用self.assertEqual(subtract(2, 3), -1)def test_car_color(self):car = Car()car.color ="blue"self.assertEqual(car.color, "blue")#屬性測試def test_car_property(self):car = Car()with self.assertRaises(AttributeError):value = car.engine@patch('datetime.datetime')# 注意此處多了一個mock_datetime參數def test_car_say(self, mock_datetime):car = Car()mock_datetime.now.return_value.hour = 9self.assertEqual(car.say(), "Good morning!")mock_datetime.now.return_value.hour = 15self.assertEqual(car.say(), "Good afternoon!")mock_datetime.now.return_value.hour = 20self.assertEqual(car.say(), "Good evening!")if __name__ == '__main__':# 創建測試套件suite = unittest.TestSuite()suite.addTest(TestAll('test_add'))suite.addTest(TestAll('test_subtract'))suite.addTest(TestAll('test_car_property'))suite.addTest(TestAll('test_car_say'))# 創建測試運行器runner = unittest.TextTestRunner()runner.run(suite)

結果輸出:

備工作完成
結束清理工作完成
.準備工作完成
結束清理工作完成
.準備工作完成
結束清理工作完成
.
----------------------------------------------------------------------
Ran 4 tests in 0.002sOK (skipped=1)

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

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

相關文章

算法刷題力扣

先把大寫的字母變成小寫的&#xff0c;用大寫字母32即可變為小寫字母。 寫循環跳過字符。 然后判斷是否相等即可。具體代碼如下&#xff1a; class Solution { public: bool isPalindrome(string s) { int sizes.size(); int begin0; int ends.size()-1; for(int i0;i<s…

allure下載安裝及配置

這里寫目錄標題 一、JDK下載安裝及配置二、allure下載三、allure安裝四、allure環境變量配置五、allure驗證是否安裝成功 一、JDK下載安裝及配置 allure 是一個java測試報告框架。所以要基于JDK環境。 JDK下載與安裝及配置&#xff1a;https://blog.csdn.net/qq_24741027/arti…

linux之 內存管理(1)-armv8 內核啟動頁表建立過程

一、內核啟動時&#xff0c;頁表映射有哪些&#xff1f; Linux初始化過程&#xff0c;會依次建立如下頁表映射&#xff1a; 1.恒等映射&#xff1a;頁表基地址idmap_pg_dir; 2.粗粒度內核鏡像映射&#xff1a;頁表基地址init_pg_dir; 3.fixmap映射&#xff1a;頁表基地址為…

【面試問題】Java 接口與抽象類的區別

引言 在 Java 面向對象編程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象類&#xff08;Abstract Class&#xff09;是兩個重要的抽象工具。它們都能定義未實現的方法&#xff0c;但設計目標和使用場景截然不同。本文將通過語法、特性和實際案例&#xff0c;深入…

【資料分享】全志科技T113-i全國產(1.2GHz雙核A7 RISC-V)工業核心板規格書

核心板簡介 創龍科技SOM-TLT113 是一款基于全志科技T113-i 雙核ARM Cortex-A7 玄鐵C906 RISC-V HiFi4 DSP 異構多核處理器設計的全國產工業核心板&#xff0c;ARM Cortex-A7 處理單元主頻高達1.2GHz。核心板 CPU、ROM、RAM、電源、晶振等所有元器件均采用國產工業級方案&…

R語言高效數據處理-自定義格式EXCEL數據輸出

注&#xff1a;以下代碼均為實際數據處理中的筆記摘錄&#xff0c;所以很零散&#xff0c; 將就看吧&#xff0c;這一篇只是代表著我還在&#xff0c;所以可能用處不大&#xff0c;這一段時間都很煎熬&#xff01; 在實際數據處理中為了提升效率&#xff0c;將Excel報表交付給…

LeetCode 30 —— 30.串聯所有單詞的子串

題目&#xff1a; 給定一個字符串 s 和一些長度相同的單詞 words。找出 s 中恰好可以由 words 中所有單詞串聯形成的子串的起始位置。 注意子串要與 words 中的單詞完全匹配&#xff0c;中間不能有其他字符&#xff0c;但不需要考慮 words 中單詞串聯的順序。 示例 1&#xff…

《算法筆記》9.2小節——數據結構專題(2)->二叉樹的遍歷 問題 A: 復原二叉樹(同問題 C: 二叉樹遍歷)

題目描述 小明在做數據結構的作業&#xff0c;其中一題是給你一棵二叉樹的前序遍歷和中序遍歷結果&#xff0c;要求你寫出這棵二叉樹的后序遍歷結果。 輸入 輸入包含多組測試數據。每組輸入包含兩個字符串&#xff0c;分別表示二叉樹的前序遍歷和中序遍歷結果。每個字符串由…

SpringBoot-2整合MyBatis以及基本的使用方法

目錄 1.引入依賴 2.數據庫表的創建 3.數據源的配置 4.編寫pojo類 5.編寫controller類 6.編寫接口 7.編寫接口的實現類 8.編寫mapper 1.引入依賴 在pom.xml引入依賴 <!-- mysql--><dependency><groupId>com.mysql</groupId><artifac…

Unity Shader Graph高級節點邏輯設計:程序化噪聲生成技術詳解

一、程序化噪聲的核心價值 程序化噪聲生成是Shader開發中的關鍵核心技術&#xff0c;通過數學算法直接生成紋理信息&#xff0c;相較于傳統位圖紋理具有以下優勢&#xff1a; 無限分辨率&#xff1a;可動態適應任意顯示精度 參數化控制&#xff1a;實時調整噪聲頻率、振幅等屬…

[藍橋杯 2023 省 B] 飛機降落(不會dfs的看過來)

[藍橋杯 2023 省 B] 飛機降落 題目描述 N N N 架飛機準備降落到某個只有一條跑道的機場。其中第 i i i 架飛機在 T i T_{i} Ti? 時刻到達機場上空&#xff0c;到達時它的剩余油料還可以繼續盤旋 D i D_{i} Di? 個單位時間&#xff0c;即它最早可以于 T i T_{i} Ti? 時刻…

英偉達GTC 2025大會產品全景剖析與未來路線深度洞察分析

【完整版】3月19日&#xff0c;黃仁勛Nvidia GTC 2025 主題演講&#xff5c;英偉達 英偉達GTC 2025大會產品全景剖析與未來路線深度洞察分析 一、引言 1.1 分析內容 本研究主要采用了文獻研究法、數據分析以及專家觀點引用相結合的方法。在文獻研究方面&#xff0c;廣泛收集了…

強化學習 - PPO控制無人機

PPO&#xff08;Proximal Policy Optimization&#xff0c;近端策略優化&#xff09;是一種強化學習算法&#xff0c;用于訓練智能體&#xff08;無人機&#xff09;如何在環境中做出決策。它本質上是 策略梯度&#xff08;Policy Gradient&#xff09;方法 的一種改進&#xf…

YOLO11報錯:AttributeError: module ‘torch‘ has no attribute ‘OutOfMemoryError‘

事情是這樣的&#xff1a;前幾天YOLO11的代碼還是可以訓練的&#xff0c;昨天訓練了一天&#xff0c;今天換模型就報這個錯。 AttributeError: module torch has no attribute OutOfMemoryError我查了一下&#xff1a;YOLO11官方代碼issues里面也有人有同樣的問題&#xff0c;…

Prometheus使用

介紹&#xff1a;Prometheus 是一個開源的 監控與告警系統&#xff0c;主要用于采集和存儲時間序列數據&#xff08;Time Series Data&#xff09; Prometheus的自定義查詢語言PromQL Metric類型 為了能夠幫助用戶理解和區分這些不同監控指標之間的差異&#xff0c;Prometheu…

ESG報告評級標準解讀

ESG&#xff08;環境、社會、治理&#xff09;報告評級標準用于評估企業在環境、社會和公司治理方面的表現。以下是主要評級標準的解讀&#xff1a; 1. 環境&#xff08;Environmental&#xff09; 碳排放&#xff1a;評估企業的溫室氣體排放及減排措施。 能源使用&#xff1…

清晰易懂的 PHP 安裝與配置教程

初學者也能看懂的 PHP 安裝與配置教程 本教程將手把手教你如何在 Windows 系統上安裝 PHP&#xff0c;并配置 Composer&#xff08;PHP 的依賴管理工具&#xff09;的緩存位置&#xff0c;即使你是零基礎小白&#xff0c;也能輕松完成&#xff01; 一、準備工作 操作系統&…

Zabbix監控自動化(Zabbix Mnitoring Automation)

??????zabbix監控自動化 1、自動化監控(網絡發現與自動注冊只能用其一) 1.1 ansible安裝zabbix agent 新采購100臺服務器&#xff1a; 1、安裝操作系統 2、初始化操作系統 3、安裝zabbix agent 1.手動部暑 2.腳本部暑(shell expect) 3.ansible 4、納入監控 1.…

Android Launcher3 首屏圖標鎖定技術方案解析

一、需求背景與技術挑戰 在Android 13系統定制開發中&#xff0c;需實現Launcher首屏圖標固定功能。該需求需在以下技術維度進行突破&#xff1a; 拖拽事件攔截機制&#xff1a;需精準識別拖拽目標區域 布局層級判定&#xff1a;準確識別第一屏的布局標識 跨屏操作限制&…

Spring Framework 中 BeanDefinition 是什么

BeanDefinition 是 Spring Framework 中一個核心的接口&#xff0c;它描述了一個 Bean 的定義。你可以把它看作是 Spring IoC 容器中 Bean 的“藍圖”或“配置元數據”。它包含了 Spring 容器創建、配置和管理 Bean 所需的所有信息。 BeanDefinition 中包含的信息&#xff1a;…