本文內(nèi)容概覽
pytest能實現(xiàn)的功能(簡介)
自動發(fā)現(xiàn)測試用例:pytest會自動查找項目中以
test_
或test
開頭的文件、以Test
開頭的類和以test_
或test
開頭的函數(shù),并執(zhí)行它們作為測試用例。靈活的測試用例編寫:pytest允許使用簡潔的語法編寫測試用例悍赢,可以使用函數(shù)岛宦、類和裝飾器等方式組織測試代碼。這使得測試用例的編寫更加靈活和易于維護啊奄。
豐富的斷言庫:pytest提供了豐富的斷言方法纬朝,用于驗證測試結(jié)果是否符合預期收叶。這些斷言方法包括比較運算符、容器操作共苛、異常處理等判没。使用這些斷言方法可以編寫清晰、簡潔的斷言語句隅茎。
參數(shù)化測試(parametrize):pytest支持參數(shù)化測試澄峰,可以通過一次編寫多個測試用例,并使用不同的參數(shù)進行測試辟犀。這樣可以減少冗余的代碼俏竞,提高測試的覆蓋率。
豐富的插件生態(tài)系統(tǒng):pytest具有一個活躍的插件生態(tài)系統(tǒng)堂竟,可以通過安裝插件來擴展其功能魂毁。這些插件可以用于生成測試報告、集成持續(xù)集成工具出嘹、模擬網(wǎng)絡(luò)請求等席楚。插件的使用可以根據(jù)需求定制測試框架的功能。
并發(fā)執(zhí)行測試:pytest支持并發(fā)執(zhí)行測試用例疚漆,可以提高測試的效率酣胀。這對于大型項目和長時間運行的測試套件特別有用。
集成其他測試工具:pytest可以與其他測試工具(如Selenium娶聘、Mock等)進行集成,方便進行更復雜的測試場景甚脉。這樣可以擴展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 安裝命令安裝即可
默認用例執(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ù)中的輸出
顯示詳細的測試結(jié)果信息
pytest -v
- py文件中調(diào)用
import pytest
if __name__ == '__main__':
pytest.main(["執(zhí)行參數(shù)"]) // 列表中放執(zhí)行參數(shù)
-
pycharm 中執(zhí)行 (需要設(shè)置好pycharm的Default test runner)
運行規(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
按照標記運行
這里不具體講 等到學習mark的時候再展開說
# 這樣就會運行 指定標記的case
pytest -m 標記
斷言
斷言用于驗證測試結(jié)果是否符合預期
pytest的斷言比較簡單 直接使用python內(nèi)置的 assert
即可進行斷言
基本語法
assert 表達式
- 當表達式結(jié)果為 True時 斷言通過
- 當表達式為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裝飾器來斷言代碼是否拋出了預期的異常
例如岭皂,pytest.raises(ZeroDivisionError)用于斷言被裝飾的代碼塊是否拋出了0作為被除數(shù)的異常。