做網(wǎng)站百度新聞源合肥關(guān)鍵詞排名
1.?unittest 介紹
-
是什么:Python 標(biāo)準(zhǔn)庫(kù)自帶的單元測(cè)試框架,遵循 xUnit 架構(gòu)(類似Java的JUnit)。
-
核心概念:
-
TestCase
:測(cè)試用例的基類,所有測(cè)試類需繼承它。 -
TestSuite
:測(cè)試套件,用于聚合多個(gè)測(cè)試用例。 -
TestLoader
:加載測(cè)試用例。 -
TestRunner
:執(zhí)行測(cè)試并輸出結(jié)果。
-
-
適用場(chǎng)景:單元測(cè)試、集成測(cè)試,適合需要與Python標(biāo)準(zhǔn)庫(kù)深度集成的項(xiàng)目。
2.?環(huán)境搭建
-
無(wú)需安裝:Python 自帶,直接導(dǎo)入即可:
python
復(fù)制
import unittest
3.?用例規(guī)則
-
測(cè)試類:必須繼承?
unittest.TestCase
。 -
測(cè)試方法:以?
test_
?開(kāi)頭(如?test_login
)。 -
斷言方法:使用?
self.assertXxx()
(如?self.assertEqual()
)。
4.?用例編寫示例
python
復(fù)制
import unittestclass TestMath(unittest.TestCase):def test_add(self):self.assertEqual(1 + 1, 2)def test_multiply(self):self.assertTrue(2 * 3 == 6)if __name__ == "__main__":unittest.main()
5.?斷言方法
方法 | 說(shuō)明 |
---|---|
self.assertEqual(a, b) | 斷言 a == b |
self.assertNotEqual(a, b) | 斷言 a != b |
self.assertTrue(x) | 斷言 x 為 True |
self.assertFalse(x) | 斷言 x 為 False |
self.assertIn(a, b) | 斷言 a 在 b 中 |
self.assertRaises(Error) | 斷言代碼塊拋出指定異常 |
6.?測(cè)試夾具(Setup/Teardown)
-
類級(jí)別:
python
復(fù)制
@classmethod def setUpClass(cls): # 類初始化(整個(gè)類執(zhí)行前運(yùn)行一次) @classmethod def tearDownClass(cls):# 類清理(整個(gè)類執(zhí)行后運(yùn)行一次)
-
方法級(jí)別:
python
復(fù)制
def setUp(self): # 每個(gè)測(cè)試方法執(zhí)行前運(yùn)行 def tearDown(self): # 每個(gè)測(cè)試方法執(zhí)行后運(yùn)行
7.?用例跳過(guò)
-
無(wú)條件跳過(guò):
python
復(fù)制
@unittest.skip("跳過(guò)原因") def test_skip(self):pass
-
條件跳過(guò):
python
復(fù)制
@unittest.skipIf(sys.platform == "win32", "Windows不支持") def test_linux_only(self):pass
8.?測(cè)試套件(TestSuite)
-
手動(dòng)聚合用例:
python
復(fù)制
suite = unittest.TestSuite() suite.addTest(TestMath("test_add")) suite.addTest(TestLogin("test_login"))
-
自動(dòng)發(fā)現(xiàn)用例:
python
復(fù)制
loader = unittest.TestLoader() suite = loader.loadTestsFromModule(test_module) # 從模塊加載 suite = loader.loadTestsFromTestCase(TestMath) # 從類加載
9.?參數(shù)化
-
原生不支持:需借助第三方庫(kù)?
parameterized
?或?ddt
。 -
使用?
ddt
?示例:python
復(fù)制
import ddt@ddt.ddt class TestDataDriven(unittest.TestCase):@ddt.data((1, 2, 3), (0, 0, 0))@ddt.unpackdef test_add(self, a, b, expected):self.assertEqual(a + b, expected)
10.?與 pytest 的對(duì)比
特性 | unittest | pytest |
---|---|---|
語(yǔ)法簡(jiǎn)潔性 | 需繼承?TestCase ,斷言方法較繁瑣 | 無(wú)需繼承,直接使用?assert |
參數(shù)化 | 依賴第三方庫(kù)(如ddt) | 原生支持?@pytest.mark.parametrize |
夾具 | setUp/tearDown | 更靈活的?@pytest.fixture |
插件生態(tài) | 較少 | 豐富(如并發(fā)、Allure報(bào)告) |
執(zhí)行效率 | 較低 | 更高(支持并發(fā)) |
11.?集成 HTMLTestRunner(生成測(cè)試報(bào)告)
步驟:
-
下載?
HTMLTestRunner.py
(非標(biāo)準(zhǔn)庫(kù),需單獨(dú)放置)。 -
在代碼中調(diào)用:
python
復(fù)制
with open("report.html", "wb") as f:runner = HTMLTestRunner.HTMLTestRunner(stream=f,title="測(cè)試報(bào)告",description="用例執(zhí)行詳情")runner.run(suite)
12.?生成測(cè)試報(bào)告
-
控制臺(tái)輸出:
bash
復(fù)制
python -m unittest discover -s tests # 自動(dòng)發(fā)現(xiàn)并執(zhí)行測(cè)試
-
XML 報(bào)告(用于CI集成):
bash
復(fù)制
python -m unittest discover -s tests -p "test_*.py" -v > report.xml
總結(jié)
-
適用場(chǎng)景:適合需要與Python標(biāo)準(zhǔn)庫(kù)無(wú)縫集成的項(xiàng)目,或團(tuán)隊(duì)習(xí)慣xUnit風(fēng)格。
-
優(yōu)勢(shì):
-
無(wú)需額外安裝,兼容性強(qiáng)。
-
清晰的類與方法結(jié)構(gòu)。
-
-
劣勢(shì):靈活性較低,擴(kuò)展依賴第三方庫(kù)。
-
推薦搭配:結(jié)合?
ddt
(參數(shù)化)、coverage
(覆蓋率)、HTMLTestRunner
(報(bào)告)提升效率。