本文內(nèi)容概覽

pytest能實現(xiàn)的功能(簡介)
自動發(fā)現(xiàn)測試用例:pytest會自動查找項目中以
test_或test開頭的文件、以Test開頭的類和以test_或test開頭的函數(shù),并執(zhí)行它們作為測試用例。靈活的測試用例編寫:pytest允許使用簡潔的語法編寫測試用例,可以使用函數(shù)、類和裝飾器等方式組織測試代碼。這使得測試用例的編寫更加靈活和易于維護(hù)。
豐富的斷言庫:pytest提供了豐富的斷言方法,用于驗證測試結(jié)果是否符合預(yù)期。這些斷言方法包括比較運算符、容器操作、異常處理等。使用這些斷言方法可以編寫清晰、簡潔的斷言語句。
參數(shù)化測試(parametrize):pytest支持參數(shù)化測試,可以通過一次編寫多個測試用例,并使用不同的參數(shù)進(jìn)行測試。這樣可以減少冗余的代碼,提高測試的覆蓋率。
豐富的插件生態(tài)系統(tǒng):pytest具有一個活躍的插件生態(tài)系統(tǒng),可以通過安裝插件來擴展其功能。這些插件可以用于生成測試報告、集成持續(xù)集成工具、模擬網(wǎng)絡(luò)請求等。插件的使用可以根據(jù)需求定制測試框架的功能。
并發(fā)執(zhí)行測試:pytest支持并發(fā)執(zhí)行測試用例,可以提高測試的效率。這對于大型項目和長時間運行的測試套件特別有用。
集成其他測試工具:pytest可以與其他測試工具(如Selenium、Mock等)進(jìn)行集成,方便進(jìn)行更復(fù)雜的測試場景。這樣可以擴展pytest的功能,滿足特定的測試需求。
安裝
pip3 install -U pytest

顯示 Successfully installed 代表安裝好了
注意
如果安裝過慢可以更改下載源來增加下載安裝速度 這里可以更改安裝源(這里以清華源為例)
https://mirrors.tuna.tsinghua.edu.cn/help/pypi/
python -m pip install --upgrade pip
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
更改后再執(zhí)行 pip 安裝命令安裝即可
默認(rèn)用例執(zhí)行規(guī)則
pytest會自動查找項目中以test_或test開頭的文件、以Test開頭的類和以test_或test開頭的函數(shù),并將它們作為測試用例執(zhí)行。
pytest會遞歸地搜索項目目錄及其子目錄中的測試文件,找到所有符合命名規(guī)則的測試用例
總結(jié)就是
- 文件要以
test_*.py或*_test.py命名 - 測試類要以
Test開頭 - 函數(shù)要以
test或者test_開頭
pycharm編寫運行第一個測試用例
"""編寫的第一個case"""
def test_01_case():
print("test_01_case")
class TestFirstCase(object):
def test_class_case(self):
print("test_class_case")
def no_test_case(self):
print("no_test_case")
def no_test_case2():
print("no_test_case")

可以看到按照規(guī)則寫的pytest收集到并執(zhí)行了
運行方式
執(zhí)行的三種方式
- 命令行執(zhí)行
pytest + 執(zhí)行參數(shù)
py.test + 執(zhí)行參數(shù)
python -m pytest + 執(zhí)行參數(shù)
這里插播介紹兩個常用的執(zhí)行參數(shù) (-s -v)
允許直接打印測試函數(shù)中的輸出
pytest -s # 允許直接打印測試函數(shù)中的輸出

顯示詳細(xì)的測試結(jié)果信息
pytest -v

- py文件中調(diào)用
import pytest
if __name__ == '__main__':
pytest.main(["執(zhí)行參數(shù)"]) // 列表中放執(zhí)行參數(shù)
-
pycharm 中執(zhí)行 (需要設(shè)置好pycharm的Default test runner)
image.png
image.png
運行規(guī)則
執(zhí)行文件夾下所有的case
pytest /指定目錄
# 或者 cd到這個目錄下執(zhí)行 pytest
pytest
執(zhí)行單個py文件
# 指定 pytest 具體的文件名
pytest test_xxx.py
按節(jié)點nodeid運行(每個case代表一個節(jié)點nodeid)
- pytest 文件名::class::test_case (類的方式編寫的case)
- pytest 文件路徑/文件名::class::test_case
- pytest 文件名::test_case (函數(shù)方式編寫的case)
- pytest 文件路徑/文件名::test_case
# 執(zhí)行類中具體的某一條case
pytest test_01_first_case.py::TestFirstCase::test_class_case
# 執(zhí)行類
pytest test_01_first_case.py::TestFirstCase
# 執(zhí)行某一條case
pytest test_01_first_case.py::test_01_case
# 執(zhí)行文件
pytest test_01_first_case.py
按關(guān)鍵詞運行
# 運行名稱包含 case但是不包含class的用例
pytest -k "case and not class" -v
按照標(biāo)記運行
這里不具體講 等到學(xué)習(xí)mark的時候再展開說
# 這樣就會運行 指定標(biāo)記的case
pytest -m 標(biāo)記
斷言
斷言用于驗證測試結(jié)果是否符合預(yù)期
pytest的斷言比較簡單 直接使用python內(nèi)置的 assert 即可進(jìn)行斷言
基本語法
assert 表達(dá)式
- 當(dāng)表達(dá)式結(jié)果為 True時 斷言通過
- 當(dāng)表達(dá)式為False時 斷言失敗 本條case算是失敗 然后繼續(xù)跑后續(xù)的case
def test_01_case():
print("test_01_case")
assert 1 != 1 # 這里 1 != 1 結(jié)果是False 所以這條case失敗
這里 1 != 1 結(jié)果是False 所以這條case失敗

一些常用的斷言
- assert a >= b
- assert a == b
- assert len(a) == len(b) # 容器類的斷言(如列表、字典)
- assert a in b
附加知識:對于拋出的異常pytest允許使用pytest.raises裝飾器來斷言代碼是否拋出了預(yù)期的異常
例如,pytest.raises(ZeroDivisionError)用于斷言被裝飾的代碼塊是否拋出了0作為被除數(shù)的異常。

