Python?unittest快速入門使用指南
前言
在軟件開發(fā)中,“保證代碼正確性”是核心需求之一。當我們編寫函數(shù)、類或模塊后,如何驗證其行為符合預(yù)期?如何在修改代碼后快速排查問題?單元測試是解決這些問題的關(guān)鍵技術(shù),而 Python 內(nèi)置的 unittest 模塊(基于 xUnit 框架),正是實現(xiàn)單元測試的強大工具——無需額外安裝,語法規(guī)范,支持自動化測試、用例組織、斷言校驗等核心功能。
一、什么是單元測試與 unittest?
1.1 單元測試的核心價值
單元測試是對軟件中最小可測試單元(如函數(shù)、方法、類)的獨立驗證,核心目標是:
- 驗證代碼行為符合預(yù)期(輸入特定參數(shù)時,輸出是否正確);
- 快速定位問題(修改代碼后,若測試失敗,可精準定位改動影響的范圍);
- 支持安全重構(gòu)(重構(gòu)代碼邏輯時,通過單元測試確保功能不退化);
- 提升代碼質(zhì)量(編寫測試時,會倒逼開發(fā)者設(shè)計更易測試、低耦合的代碼)。
1.2 unittest 模塊簡介
unittest 是 Python 標準庫內(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)
# 測試負數(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:帶詳細日志執(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 != b | self.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 為 True | self.assertTrue(10 > 5) |
assertFalse(x) | 驗證 x 為 False | self.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 是 None | self.assertIsNone(get_user(999)) |
assertGreater(a, b) | 驗證 a > b | self.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 與測試套件
當測試用例增多時,需要高效組織用例(如共享資源初始化、批量執(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í)行后輸出(可見 setUp 和 tearDown 被自動調(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:手動組織測試用例
當需要批量執(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 顯示詳細日志
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)當前目錄下所有以 test_ 開頭的文件中的測試用例
suite = unittest.defaultTestLoader.discover(
start_dir='.', # 搜索目錄
pattern='test_*.py', # 測試文件匹配規(guī)則
top_level_dir=None # 頂級目錄(默認 None 表示 start_dir)
)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suite)
五、unittest 進階用法
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 標記:
s.s ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK (skipped=3)
5.2 預(yù)期失敗(expectedFailure)
如果某個測試用例已知會失敗(如已知 bug 未修復(fù)),可使用 @unittest.expectedFailure 裝飾器,標記為“預(yù)期失敗”——執(zhí)行失敗時不會計入錯誤統(tǒng)計:
class TestExpectedFailure(unittest.TestCase):
@unittest.expectedFailure
def test_divide_by_zero(self):
# 已知該用例當前會失?。僭O(shè) bug 未修復(fù))
self.assertEqual(divide(5, 0), 0) # 實際會拋出異常,預(yù)期失敗
執(zhí)行后,該用例會顯示 x 標記,不會導(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 默認生成文本報告,可讀性較差??赏ㄟ^第三方庫 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í)行后,會在當前目錄生成 test_report.html 文件,打開后可看到測試通過率、用例詳情、失敗原因等信息,適合團隊協(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 可查看詳細的覆蓋率報告(紅色表示未覆蓋,綠色表示已覆蓋)。
六、實戰(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ù)、負數(shù))"""
# 非整數(shù)ID
with self.assertRaises(ValueError) as ctx:
self.manager.add_user("a", "張三")
self.assertEqual(str(ctx.exception), "用戶ID必須是正整數(shù)")
# 負數(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ù)、負數(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 最佳實踐
測試用例設(shè)計原則:
- 覆蓋核心場景(正常輸入、邊界值、異常輸入);
- 一個測試方法只驗證一個核心邏輯(避免“大而全”的測試);
- 測試方法命名清晰(如
test_add_user_duplicate_id而非test_add_2)。
代碼組織:
- 測試文件與源碼文件分離(如
src/存源碼,tests/存測試文件); - 測試文件名與源碼文件名對應(yīng)(如
calculator.py→test_calculator.py)。
- 測試文件與源碼文件分離(如
自動化集成:
- 將單元測試集成到 CI/CD 流程(如 GitHub Actions、Jenkins),每次提交代碼自動執(zhí)行測試;
- 要求測試覆蓋率達到一定閾值(如 80%),避免未測試代碼上線。
避免過度測試:
- 不測試第三方庫或標準庫的功能;
- 不測試實現(xiàn)細節(jié)(只測試接口行為,如函數(shù)輸入輸出,而非內(nèi)部變量)。
八、unittest 與 pytest 對比
unittest 是 Python 內(nèi)置框架,穩(wěn)定可靠,但語法較繁瑣(需繼承類、方法名固定);而 pytest 是第三方框架,語法更簡潔(無需繼承類、支持函數(shù)式測試),且兼容 unittest 用例。
| 特性 | unittest | pytest |
|---|---|---|
| 安裝 | 內(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ā)標準庫項目,unittest 足夠使用;如果追求更高效率和靈活性,可嘗試 pytest(兼容已有 unittest 用例,遷移成本低)。
若需進一步深入,可參考 Python 官方文檔:unittest — 單元測試框架。
到此這篇關(guān)于Python unittest快速入門使用指南的文章就介紹到這了,更多相關(guān)Python unittest使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python學(xué)習(xí)小技巧之利用字典的默認行為
這篇文章主要給大家介紹了Python學(xué)習(xí)小技巧之利用字典的默認行為的相關(guān)資料,文中介紹的非常詳細,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
python時間日期函數(shù)與利用pandas進行時間序列處理詳解
python標準庫包含于日期(date)和時間(time)數(shù)據(jù)的數(shù)據(jù)類型,datetime、time以及calendar模塊會被經(jīng)常用到,而pandas則可以對時間進行序列化排序2018-03-03
Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細教程)
這篇文章主要介紹了Pycharm2020最新激活碼|永久激活(附最新激活碼和插件的詳細教程),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明
這篇文章主要介紹了pandas:get_dummies()與pd.factorize()的用法及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-05-05
Python判斷字符串是否包含特定子字符串的多種方法(7種方法)
我們經(jīng)常會遇這樣一個需求判斷字符串中是否包含某個關(guān)鍵詞,也就是特定的子字符串,接下來通過本文給大家分享Python判斷字符串是否包含特定子字符串的多種方法(7種方法),需要的朋友可以參考下2023-03-03
移除Selenium中window.navigator.webdriver值
這篇文章主要為大家介紹了如何正確的移除Selenium中window.navigator.webdriver的值方法步驟,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

