最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python?unittest快速入門使用指南

 更新時間:2025年11月24日 10:11:13   作者:竹子_23  
這篇文章主要介紹了Python?unittest快速入門使用的相關(guān)資料,Unittest是Python標(biāo)準(zhǔn)庫中自帶的單元測試框架,Unittest有時候也被稱為PyUnit,就像JUnit是Java語言的標(biāo)準(zhǔn)單元測試框架一樣,Unittest則是Python語言的標(biāo)準(zhǔn)單元測試框架,需要的朋友可以參考下

前言

在軟件開發(fā)中,“保證代碼正確性”是核心需求之一。當(dāng)我們編寫函數(shù)、類或模塊后,如何驗證其行為符合預(yù)期?如何在修改代碼后快速排查問題?單元測試是解決這些問題的關(guān)鍵技術(shù),而 Python 內(nèi)置的 unittest 模塊(基于 xUnit 框架),正是實現(xiàn)單元測試的強(qiáng)大工具——無需額外安裝,語法規(guī)范,支持自動化測試、用例組織、斷言校驗等核心功能。

一、什么是單元測試與 unittest?

1.1 單元測試的核心價值

單元測試是對軟件中最小可測試單元(如函數(shù)、方法、類)的獨立驗證,核心目標(biāo)是:

  • 驗證代碼行為符合預(yù)期(輸入特定參數(shù)時,輸出是否正確);
  • 快速定位問題(修改代碼后,若測試失敗,可精準(zhǔn)定位改動影響的范圍);
  • 支持安全重構(gòu)(重構(gòu)代碼邏輯時,通過單元測試確保功能不退化);
  • 提升代碼質(zhì)量(編寫測試時,會倒逼開發(fā)者設(shè)計更易測試、低耦合的代碼)。

1.2 unittest 模塊簡介

unittest 是 Python 標(biāo)準(zhǔn)庫內(nèi)置的單元測試框架,無需額外安裝,核心特性包括:

  • 提供 TestCase 基類,用于封裝測試用例;
  • 豐富的斷言方法(如驗證相等、包含、異常等);
  • 支持用例組織(TestSuite)和批量執(zhí)行;
  • 提供 setUp()/tearDown() 等鉤子方法,簡化測試資源的初始化與清理;
  • 支持生成測試報告(可結(jié)合第三方庫優(yōu)化格式)。

二、unittest 快速入門:編寫第一個測試用例

我們從一個簡單場景入手:編寫一個計算工具函數(shù),并用 unittest 驗證其正確性。

2.1 步驟 1:編寫待測試代碼

首先創(chuàng)建一個待測試的模塊 calculator.py,包含加法、減法兩個函數(shù):

# calculator.py
def add(a, b):
    """加法函數(shù):返回 a + b 的結(jié)果"""
    return a + b

def subtract(a, b):
    """減法函數(shù):返回 a - b 的結(jié)果"""
    return a - b

2.2 步驟 2:編寫 unittest 測試用例

創(chuàng)建測試文件 test_calculator.py(測試文件建議以 test_ 開頭,便于識別),繼承 unittest.TestCase 編寫測試類:

# test_calculator.py
import unittest
from calculator import add, subtract  # 導(dǎo)入待測試函數(shù)

# 測試類必須繼承 unittest.TestCase
class TestCalculator(unittest.TestCase):
    # 測試方法必須以 test_ 開頭(unittest 會自動識別)
    def test_add(self):
        """測試加法函數(shù):正常場景、邊界值、異常場景"""
        # 斷言:驗證 add(1, 2) 的結(jié)果是否等于 3
        self.assertEqual(add(1, 2), 3)
        # 測試負(fù)數(shù)相加
        self.assertEqual(add(-1, -2), -3)
        # 測試浮點數(shù)相加
        self.assertAlmostEqual(add(0.1, 0.2), 0.3)  # 浮點數(shù)精度問題用 assertAlmostEqual
    
    def test_subtract(self):
        """測試減法函數(shù)"""
        self.assertEqual(subtract(5, 3), 2)
        self.assertEqual(subtract(3, 5), -2)
        self.assertEqual(subtract(0, 0), 0)

# 運行測試(直接執(zhí)行該文件時觸發(fā))
if __name__ == '__main__':
    unittest.main()

2.3 步驟 3:執(zhí)行測試與查看結(jié)果

方式 1:直接運行測試文件

在終端執(zhí)行 python test_calculator.py,輸出如下:

..
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK
  • 輸出解讀:
    • .. 表示 2 個測試用例都通過(每個 . 對應(yīng)一個通過的測試方法);
    • Ran 2 tests in 0.001s 表示執(zhí)行了 2 個測試,耗時 0.001 秒;
    • OK 表示所有測試用例通過。

方式 2:命令行指定測試模塊/類/方法

# 運行指定測試模塊
python -m unittest test_calculator.py

# 運行指定測試類
python -m unittest test_calculator.TestCalculator

# 運行指定測試方法
python -m unittest test_calculator.TestCalculator.test_add

方式 3:帶詳細(xì)日志執(zhí)行(-v 參數(shù))

python -m unittest test_calculator.py -v

輸出如下(更清晰展示每個測試方法的執(zhí)行結(jié)果):

test_add (test_calculator.TestCalculator)
測試加法函數(shù):正常場景、邊界值、異常場景 ... ok
test_subtract (test_calculator.TestCalculator)
測試減法函數(shù) ... ok

----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

三、unittest 核心語法:斷言方法

斷言是單元測試的核心——通過斷言判斷代碼實際輸出是否與預(yù)期一致。unittest.TestCase 提供了豐富的斷言方法,以下是最常用的類別:

3.1 equality 斷言(驗證相等/不等)

斷言方法作用示例
assertEqual(a, b, msg=None)驗證 a == b,msg 為自定義失敗提示self.assertEqual(add(2,3),5, "加法結(jié)果錯誤")
assertNotEqual(a, b)驗證 a != bself.assertNotEqual(subtract(5,3), 3)
assertAlmostEqual(a, b, places=7)驗證浮點數(shù)近似相等(places 為保留小數(shù)位)self.assertAlmostEqual(0.1+0.2, 0.3, places=1)

3.2 布爾值斷言(驗證 True/False)

斷言方法作用示例
assertTrue(x)驗證 x 為 Trueself.assertTrue(10 > 5)
assertFalse(x)驗證 x 為 Falseself.assertFalse(10 < 5)

3.3 包含關(guān)系斷言

斷言方法作用示例
assertIn(x, container)驗證 x 在 container 中self.assertIn(3, [1,2,3])
assertNotIn(x, container)驗證 x 不在 container 中self.assertNotIn(4, [1,2,3])

3.4 異常斷言(驗證函數(shù)拋出指定異常)

斷言方法作用示例
assertRaises(exception, callable, *args, **kwargs)驗證調(diào)用函數(shù)時拋出指定異常self.assertRaises(ZeroDivisionError, divide, 5, 0)

3.5 其他常用斷言

斷言方法作用示例
assertIs(a, b)驗證 a is b(身份相等)self.assertIsNone(None)
assertIsNone(x)驗證 x 是 Noneself.assertIsNone(get_user(999))
assertGreater(a, b)驗證 a > bself.assertGreater(10, 5)

代碼示例:異常斷言實戰(zhàn)

calculator.py 添加除法函數(shù)(包含除以 0 的異常場景):

# calculator.py
def divide(a, b):
    """除法函數(shù):b 不能為 0,否則拋出 ZeroDivisionError"""
    if b == 0:
        raise ZeroDivisionError("除數(shù)不能為 0")
    return a / b

在測試類中添加異常測試方法:

# test_calculator.py
def test_divide(self):
    """測試除法函數(shù):正常場景 + 異常場景"""
    # 正常除法
    self.assertEqual(divide(10, 2), 5)
    self.assertAlmostEqual(divide(3, 2), 1.5)
    
    # 測試除以 0 拋出異常(兩種寫法)
    # 寫法 1:使用 assertRaises 作為上下文管理器
    with self.assertRaises(ZeroDivisionError) as ctx:
        divide(5, 0)
    # 驗證異常信息
    self.assertEqual(str(ctx.exception), "除數(shù)不能為 0")
    
    # 寫法 2:直接傳入函數(shù)和參數(shù)
    self.assertRaises(ZeroDivisionError, divide, 5, 0)

四、用例組織:setUp/tearDown 與測試套件

當(dāng)測試用例增多時,需要高效組織用例(如共享資源初始化、批量執(zhí)行指定用例),unittest 提供了完善的支持。

4.1 setUp() 與 tearDown():用例級資源管理

如果多個測試方法需要使用相同的資源(如創(chuàng)建對象、連接數(shù)據(jù)庫),可通過 setUp()tearDown() 簡化代碼:

  • setUp():每個測試方法執(zhí)行自動調(diào)用(初始化資源);
  • tearDown():每個測試方法執(zhí)行自動調(diào)用(清理資源)。

代碼示例:

# test_calculator.py
class TestCalculator(unittest.TestCase):
    # 每個測試方法執(zhí)行前調(diào)用
    def setUp(self):
        """初始化測試資源:創(chuàng)建計算器實例(此處模擬,實際可用于數(shù)據(jù)庫連接等)"""
        print("===== 執(zhí)行 setUp(),初始化資源 =====")
        self.calc = {
            "add": add,
            "subtract": subtract,
            "divide": divide
        }
    
    # 每個測試方法執(zhí)行后調(diào)用
    def tearDown(self):
        """清理測試資源:此處無實際操作,僅作示例"""
        print("===== 執(zhí)行 tearDown(),清理資源 =====")
    
    def test_add(self):
        self.assertEqual(self.calc["add"](1,2), 3)
    
    def test_subtract(self):
        self.assertEqual(self.calc["subtract"](5,3), 2)

執(zhí)行后輸出(可見 setUptearDown 被自動調(diào)用):

===== 執(zhí)行 setUp(),初始化資源 =====
===== 執(zhí)行 tearDown(),清理資源 =====
.===== 執(zhí)行 setUp(),初始化資源 =====
===== 執(zhí)行 tearDown(),清理資源 =====
.
----------------------------------------------------------------------
Ran 2 tests in 0.001s

OK

4.2 setUpClass() 與 tearDownClass():類級資源管理

如果資源只需初始化一次(如啟動服務(wù)器、創(chuàng)建數(shù)據(jù)庫連接池),可使用類級別的鉤子方法(需配合 @classmethod 裝飾器):

class TestCalculator(unittest.TestCase):
    # 整個測試類執(zhí)行前調(diào)用一次(類級別初始化)
    @classmethod
    def setUpClass(cls):
        print("===== 執(zhí)行 setUpClass(),初始化類級資源 =====")
        cls.db_conn = "模擬數(shù)據(jù)庫連接"  # 示例:共享數(shù)據(jù)庫連接
    
    # 整個測試類執(zhí)行后調(diào)用一次(類級別清理)
    @classmethod
    def tearDownClass(cls):
        print("===== 執(zhí)行 tearDownClass(),清理類級資源 =====")
        cls.db_conn = None  # 關(guān)閉連接

4.3 TestSuite:手動組織測試用例

當(dāng)需要批量執(zhí)行指定的測試用例(而非全部)時,可通過 TestSuite 手動組合:

# test_suite.py
import unittest
from test_calculator import TestCalculator

def create_suite():
    # 1. 創(chuàng)建測試套件
    suite = unittest.TestSuite()
    
    # 2. 向套件中添加測試用例(多種方式)
    # 方式 1:添加單個測試方法
    suite.addTest(TestCalculator("test_add"))
    suite.addTest(TestCalculator("test_divide"))
    
    # 方式 2:添加多個測試方法(列表形式)
    tests = [TestCalculator("test_subtract"), TestCalculator("test_divide")]
    suite.addTests(tests)
    
    return suite

if __name__ == '__main__':
    # 3. 創(chuàng)建測試運行器并執(zhí)行套件
    runner = unittest.TextTestRunner(verbosity=2)  # verbosity=2 顯示詳細(xì)日志
    runner.run(create_suite())

執(zhí)行 python test_suite.py,會只運行套件中指定的測試方法。

4.4 自動發(fā)現(xiàn)測試用例

如果項目中有多個測試文件(如 test_calculator.py、test_string.py),可通過 unittest.defaultTestLoader.discover() 自動發(fā)現(xiàn)并執(zhí)行所有測試:

# run_all_tests.py
import unittest

if __name__ == '__main__':
    # 發(fā)現(xiàn)當(dāng)前目錄下所有以 test_ 開頭的文件中的測試用例
    suite = unittest.defaultTestLoader.discover(
        start_dir='.',  # 搜索目錄
        pattern='test_*.py',  # 測試文件匹配規(guī)則
        top_level_dir=None  # 頂級目錄(默認(rèn) None 表示 start_dir)
    )
    runner = unittest.TextTestRunner(verbosity=2)
    runner.run(suite)

五、unittest 進(jìn)階用法

5.1 跳過測試用例(skip 裝飾器)

實際開發(fā)中,可能需要跳過某些測試(如功能未完成、環(huán)境不支持),unittest 提供了 3 個常用裝飾器:

裝飾器作用示例
@unittest.skip(reason)無條件跳過測試@unittest.skip("功能未完成,暫不測試")
@unittest.skipIf(condition, reason)條件為 True 時跳過@unittest.skipIf(sys.version_info < (3.8), "Python3.8+ 才支持")
@unittest.skipUnless(condition, reason)條件為 False 時跳過@unittest.skipUnless(os.name == "posix", "僅 Linux/Mac 環(huán)境測試")

代碼示例:

import sys
import unittest
from calculator import add

class TestSkipExample(unittest.TestCase):
    @unittest.skip("臨時跳過該測試")
    def test_add_1(self):
        self.assertEqual(add(1,2), 3)
    
    @unittest.skipIf(sys.version_info < (3, 9), "Python3.9+ 才支持該特性")
    def test_add_2(self):
        self.assertEqual(add(0.1, 0.2), 0.3)
    
    @unittest.skipUnless(sys.platform == "win32", "僅 Windows 環(huán)境測試")
    def test_add_3(self):
        self.assertEqual(add(-1, -1), -2)

執(zhí)行后,跳過的測試會顯示 s 標(biāo)記:

s.s
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK (skipped=3)

5.2 預(yù)期失敗(expectedFailure)

如果某個測試用例已知會失敗(如已知 bug 未修復(fù)),可使用 @unittest.expectedFailure 裝飾器,標(biāo)記為“預(yù)期失敗”——執(zhí)行失敗時不會計入錯誤統(tǒng)計:

class TestExpectedFailure(unittest.TestCase):
    @unittest.expectedFailure
    def test_divide_by_zero(self):
        # 已知該用例當(dāng)前會失敗(假設(shè) bug 未修復(fù))
        self.assertEqual(divide(5, 0), 0)  # 實際會拋出異常,預(yù)期失敗

執(zhí)行后,該用例會顯示 x 標(biāo)記,不會導(dǎo)致測試整體失敗。

5.3 參數(shù)化測試(結(jié)合 ddt 庫)

unittest 原生不支持參數(shù)化測試(即同一測試邏輯用多組參數(shù)重復(fù)執(zhí)行),但可通過第三方庫 ddt(Data-Driven Tests)實現(xiàn)。

步驟 1:安裝 ddt

pip install ddt

步驟 2:參數(shù)化測試示例

# test_parametrize.py
import unittest
from ddt import ddt, data, unpack  # 導(dǎo)入 ddt 相關(guān)裝飾器
from calculator import add

# 1. 用 @ddt 裝飾測試類
@ddt
class TestAddParametrize(unittest.TestCase):
    # 2. 用 @data 傳入多組測試數(shù)據(jù)(元組形式)
    @data(
        (1, 2, 3),    # 輸入 1+2,預(yù)期輸出 3
        (-1, -2, -3), # 輸入 -1+-2,預(yù)期輸出 -3
        (0.1, 0.2, 0.3),  # 浮點數(shù)測試
        (100, 200, 300)   # 大數(shù)測試
    )
    # 3. 用 @unpack 解包元組(讓參數(shù)與測試方法參數(shù)一一對應(yīng))
    @unpack
    def test_add_param(self, a, b, expected):
        """參數(shù)化測試加法函數(shù)"""
        self.assertAlmostEqual(add(a, b), expected)

if __name__ == '__main__':
    unittest.main()

執(zhí)行后,會自動為每組數(shù)據(jù)生成一個測試用例,輸出如下:

....
----------------------------------------------------------------------
Ran 4 tests in 0.001s

OK

5.4 生成 HTML 測試報告

unittest 默認(rèn)生成文本報告,可讀性較差。可通過第三方庫 unittest-html-reporting 生成美觀的 HTML 報告。

步驟 1:安裝庫

pip install unittest-html-reporting

步驟 2:生成 HTML 報告示例

# test_html_report.py
import unittest
from htmltestreport import HTMLTestReport  # 注意導(dǎo)入方式(不同庫可能不同)

if __name__ == '__main__':
    # 1. 發(fā)現(xiàn)所有測試用例
    suite = unittest.defaultTestLoader.discover(start_dir='.', pattern='test_*.py')
    
    # 2. 生成 HTML 報告
    with open('test_report.html', 'w', encoding='utf-8') as f:
        runner = HTMLTestReport(
            stream=f,
            title='計算器模塊單元測試報告',
            description='測試加法、減法、除法函數(shù)的正確性',
            tester='開發(fā)者'
        )
        runner.run(suite)

執(zhí)行后,會在當(dāng)前目錄生成 test_report.html 文件,打開后可看到測試通過率、用例詳情、失敗原因等信息,適合團(tuán)隊協(xié)作與匯報。

5.5 測試覆蓋率(結(jié)合 coverage 庫)

測試覆蓋率用于統(tǒng)計“被測試代碼的行數(shù)占總代碼行數(shù)的比例”,幫助發(fā)現(xiàn)未被測試的代碼。

步驟 1:安裝 coverage

pip install coverage

步驟 2:統(tǒng)計測試覆蓋率

# 1. 執(zhí)行測試并收集覆蓋率數(shù)據(jù)(--source 指定待統(tǒng)計的模塊)
coverage run --source=calculator.py -m unittest test_calculator.py

# 2. 查看文本格式的覆蓋率報告
coverage report

# 3. 生成 HTML 格式的覆蓋率報告(更直觀)
coverage html

輸出解讀(文本報告):

Name             Stmts   Miss  Cover
------------------------------------
calculator.py        8      0   100%
------------------------------------
TOTAL                8      0   100%
  • Stmts:總代碼行數(shù);
  • Miss:未被測試覆蓋的行數(shù);
  • Cover:覆蓋率(100% 表示所有代碼都被測試覆蓋)。

執(zhí)行 coverage html 后,會生成 htmlcov 目錄,打開 index.html 可查看詳細(xì)的覆蓋率報告(紅色表示未覆蓋,綠色表示已覆蓋)。

六、實戰(zhàn)案例:測試一個用戶管理模塊

我們模擬一個簡單的用戶管理模塊,包含“新增用戶”“查詢用戶”“刪除用戶”功能,并用 unittest 設(shè)計完整的測試用例。

6.1 待測試模塊:user_manager.py

# user_manager.py
class UserManager:
    def __init__(self):
        self.users = {}  # 存儲用戶:key=用戶ID,value=用戶名
    
    def add_user(self, user_id, username):
        """新增用戶:user_id 已存在則拋出 ValueError"""
        if not isinstance(user_id, int) or user_id <= 0:
            raise ValueError("用戶ID必須是正整數(shù)")
        if user_id in self.users:
            raise ValueError(f"用戶ID {user_id} 已存在")
        self.users[user_id] = username
        return True
    
    def get_user(self, user_id):
        """查詢用戶:返回用戶名,不存在則返回 None"""
        return self.users.get(user_id)
    
    def delete_user(self, user_id):
        """刪除用戶:返回是否刪除成功"""
        if user_id not in self.users:
            return False
        del self.users[user_id]
        return True

6.2 測試模塊:test_user_manager.py

# test_user_manager.py
import unittest
from user_manager import UserManager

class TestUserManager(unittest.TestCase):
    def setUp(self):
        """每個測試用例前初始化:創(chuàng)建用戶管理器實例"""
        self.manager = UserManager()
    
    def test_add_user_success(self):
        """測試新增用戶成功"""
        result = self.manager.add_user(1, "張三")
        self.assertTrue(result)
        self.assertEqual(self.manager.get_user(1), "張三")
    
    def test_add_user_duplicate_id(self):
        """測試新增重復(fù)用戶ID"""
        self.manager.add_user(1, "張三")
        with self.assertRaises(ValueError) as ctx:
            self.manager.add_user(1, "李四")
        self.assertEqual(str(ctx.exception), "用戶ID 1 已存在")
    
    def test_add_user_invalid_id(self):
        """測試新增用戶時傳入無效ID(非整數(shù)、負(fù)數(shù))"""
        # 非整數(shù)ID
        with self.assertRaises(ValueError) as ctx:
            self.manager.add_user("a", "張三")
        self.assertEqual(str(ctx.exception), "用戶ID必須是正整數(shù)")
        
        # 負(fù)數(shù)ID
        with self.assertRaises(ValueError) as ctx:
            self.manager.add_user(-2, "李四")
        self.assertEqual(str(ctx.exception), "用戶ID必須是正整數(shù)")
    
    def test_get_user_exist(self):
        """測試查詢存在的用戶"""
        self.manager.add_user(2, "李四")
        self.assertEqual(self.manager.get_user(2), "李四")
    
    def test_get_user_not_exist(self):
        """測試查詢不存在的用戶"""
        self.assertIsNone(self.manager.get_user(999))
    
    def test_delete_user_success(self):
        """測試刪除存在的用戶"""
        self.manager.add_user(3, "王五")
        result = self.manager.delete_user(3)
        self.assertTrue(result)
        self.assertIsNone(self.manager.get_user(3))
    
    def test_delete_user_not_exist(self):
        """測試刪除不存在的用戶"""
        result = self.manager.delete_user(999)
        self.assertFalse(result)

if __name__ == '__main__':
    unittest.main(verbosity=2)

6.3 執(zhí)行測試與查看結(jié)果

python test_user_manager.py -v

輸出如下(所有測試用例通過):

test_add_user_invalid_id (test_user_manager.TestUserManager)
測試新增用戶時傳入無效ID(非整數(shù)、負(fù)數(shù)) ... ok
test_add_user_duplicate_id (test_user_manager.TestUserManager)
測試新增重復(fù)用戶ID ... ok
test_add_user_success (test_user_manager.TestUserManager)
測試新增用戶成功 ... ok
test_delete_user_not_exist (test_user_manager.TestUserManager)
測試刪除不存在的用戶 ... ok
test_delete_user_success (test_user_manager.TestUserManager)
測試刪除存在的用戶 ... ok
test_get_user_exist (test_user_manager.TestUserManager)
測試查詢存在的用戶 ... ok
test_get_user_not_exist (test_user_manager.TestUserManager)
測試查詢不存在的用戶 ... ok

----------------------------------------------------------------------
Ran 7 tests in 0.001s

OK

七、unittest 常見問題與最佳實踐

7.1 常見問題

問題 1:測試方法未執(zhí)行

  • 原因:測試方法未以 test_ 開頭(unittest 只識別以 test_ 開頭的方法);
  • 解決:將方法名改為 test_xxx 格式(如 test_add 而非 add_test)。

問題 2:測試用例依賴順序

  • 現(xiàn)象:某個測試方法執(zhí)行失敗,因為它依賴前一個測試方法的執(zhí)行結(jié)果;
  • 原則:測試用例必須獨立(互不依賴),每個用例應(yīng)能單獨運行;
  • 解決:使用 setUp() 為每個用例重新初始化資源,避免依賴其他用例的執(zhí)行結(jié)果。

問題 3:浮點數(shù)斷言失敗

  • 現(xiàn)象:assertEqual(0.1+0.2, 0.3) 失?。ǜ↑c數(shù)精度問題);
  • 解決:使用 assertAlmostEqual(a, b, places=1)assertEqual(round(a+b, 1), 0.3)

7.2 最佳實踐

  1. 測試用例設(shè)計原則

    • 覆蓋核心場景(正常輸入、邊界值、異常輸入);
    • 一個測試方法只驗證一個核心邏輯(避免“大而全”的測試);
    • 測試方法命名清晰(如 test_add_user_duplicate_id 而非 test_add_2)。
  2. 代碼組織

    • 測試文件與源碼文件分離(如 src/ 存源碼,tests/ 存測試文件);
    • 測試文件名與源碼文件名對應(yīng)(如 calculator.pytest_calculator.py)。
  3. 自動化集成

    • 將單元測試集成到 CI/CD 流程(如 GitHub Actions、Jenkins),每次提交代碼自動執(zhí)行測試;
    • 要求測試覆蓋率達(dá)到一定閾值(如 80%),避免未測試代碼上線。
  4. 避免過度測試

    • 不測試第三方庫或標(biāo)準(zhǔn)庫的功能;
    • 不測試實現(xiàn)細(xì)節(jié)(只測試接口行為,如函數(shù)輸入輸出,而非內(nèi)部變量)。

八、unittest 與 pytest 對比

unittest 是 Python 內(nèi)置框架,穩(wěn)定可靠,但語法較繁瑣(需繼承類、方法名固定);而 pytest 是第三方框架,語法更簡潔(無需繼承類、支持函數(shù)式測試),且兼容 unittest 用例。

特性unittestpytest
安裝內(nèi)置,無需安裝pip install pytest
語法必須繼承 TestCase,方法名以 test_ 開頭支持函數(shù)式測試、類測試,更靈活
斷言只能用 self.assertEqual() 等方法支持原生 == 斷言,也兼容 unittest 斷言
參數(shù)化需第三方庫(ddt)內(nèi)置 @pytest.mark.parametrize
插件生態(tài)較少豐富(如 pytest-html、pytest-cov)

如果是新手入門或開發(fā)標(biāo)準(zhǔn)庫項目,unittest 足夠使用;如果追求更高效率和靈活性,可嘗試 pytest(兼容已有 unittest 用例,遷移成本低)。

若需進(jìn)一步深入,可參考 Python 官方文檔:unittest — 單元測試框架。

到此這篇關(guān)于Python unittest快速入門使用指南的文章就介紹到這了,更多相關(guān)Python unittest使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python使用edge-tts實現(xiàn)文字轉(zhuǎn)語音功能

    python使用edge-tts實現(xiàn)文字轉(zhuǎn)語音功能

    Edge-TTS(edge-tts Python 模塊)本質(zhì)上是一個調(diào)用 Microsoft Edge 瀏覽器的在線 TTS 服務(wù)的工具,本文將使用edge-tts實現(xiàn)文字轉(zhuǎn)語音功能,感興趣的可以了解下
    2025-05-05
  • python創(chuàng)建列表并給列表賦初始值的方法

    python創(chuàng)建列表并給列表賦初始值的方法

    這篇文章主要介紹了python創(chuàng)建列表并給列表賦初始值的方法,涉及Python列表的定義與賦值技巧,需要的朋友可以參考下
    2015-07-07
  • python定時任務(wù)schedule庫用法詳細(xì)講解

    python定時任務(wù)schedule庫用法詳細(xì)講解

    python中有一個輕量級的定時任務(wù)調(diào)度的庫schedule,下面這篇文章主要給大家介紹了關(guān)于python定時任務(wù)schedule庫用法的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-01-01
  • pyqt6實現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    pyqt6實現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼

    本文主要介紹了pyqt6實現(xiàn)關(guān)閉窗口前彈出確認(rèn)框的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • python網(wǎng)絡(luò)編程socket實現(xiàn)服務(wù)端、客戶端操作詳解

    python網(wǎng)絡(luò)編程socket實現(xiàn)服務(wù)端、客戶端操作詳解

    這篇文章主要介紹了python網(wǎng)絡(luò)編程socket實現(xiàn)服務(wù)端、客戶端操作,結(jié)合實例形式分析了python基于socket實現(xiàn)服務(wù)端、客戶端相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2020-03-03
  • 手動實現(xiàn)把python項目發(fā)布為exe可執(zhí)行程序過程分享

    手動實現(xiàn)把python項目發(fā)布為exe可執(zhí)行程序過程分享

    這篇文章主要介紹了手動實現(xiàn)把python項目發(fā)布為exe可執(zhí)行程序過程分享,本文使用C語言實現(xiàn)了一個簡潔的Python打包程序,需要的朋友可以參考下
    2014-10-10
  • Python Dataframe常見索引方式詳解

    Python Dataframe常見索引方式詳解

    這篇文章主要介紹了Python Dataframe常見索引方式詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • 關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解

    關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解

    今天小編就為大家分享一篇關(guān)于Python核心框架tornado的異步協(xié)程的2種方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • python SocketServer源碼深入解讀

    python SocketServer源碼深入解讀

    這篇文章主要介紹了python SocketServer源碼深入解讀,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • Python繪圖之二維圖與三維圖詳解

    Python繪圖之二維圖與三維圖詳解

    這篇文章主要介紹了Python繪圖之二維圖與三維圖詳解,文中通過示例代碼與效果圖片一一對照介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08

最新評論

南昌市| 兴和县| 安庆市| 中牟县| 贵港市| 施甸县| 开鲁县| 博客| 莎车县| 都兰县| 黔江区| 富源县| 安陆市| 大丰市| 靖州| 禄丰县| 莫力| 大兴区| 兴隆县| 晋宁县| 江都市| 剑河县| 高密市| 盐津县| 如东县| 徐闻县| 漳浦县| 万宁市| 花莲县| 固镇县| 陇川县| 安泽县| 乐清市| 保康县| 昭觉县| 河曲县| 大丰市| 高淳县| 福鼎市| 昌乐县| 江陵县|