作者:Gakki
01 Pytest 用例規(guī)則
Pytest 可以在不同的函數(shù)命迈、包中發(fā)現(xiàn)用例,發(fā)現(xiàn)的規(guī)則如下:
- 文件名以 test_ 開頭的 py 文件
- 以 test_ 開頭的函數(shù)
- 以 Test 開頭的類
- 以 test_ 開頭的方法
- 注:所有的包必須要有 init.py 文件
02 Pytest 運行方式
單獨執(zhí)行某一個 py 文件里所有的用例:
pytest test_login.py
執(zhí)行目錄下所有的用例:
pytest testcase/
單獨執(zhí)行某個用例
以函數(shù)形式的用例
pytest test_login.py::test_login
以類形式的用例
pytest test_login.py::TestClass::test_login
03 setup 和 teardown 函數(shù)
- setup和teardown主要分為:模塊級,類級,功能級尉桩,函數(shù)級。
- 存在于測試類內部
函數(shù)級別:運行于測試方法的始末,即:運行一次測試函數(shù)會運行一次 setup 和 teardown
類級別:運行于測試類的始末喇辽,即:在一個測試內只運行一次 setup_class 和 teardown_class ,不關心測試類內有多少個測試函數(shù)雨席。
04 裝飾器之 Fixture
Fixture 裝飾器的用途:
- 做測試前后的初始化設置菩咨,如測試數(shù)據準備,鏈接數(shù)據庫陡厘,打開瀏覽器等這些操作都可以使用Fixture來實現(xiàn)抽米。
- 測試用例的前置條件可以使用Fixture實現(xiàn),比直接使用Pytest框架的setup()和teardown()函數(shù)更加靈活糙置。
- Fixture是Pytest用于將測試前后進行預備云茸,清理工作的代碼分離出核心測試邏輯的一種機制。
- Fixture可以實現(xiàn)Unittest不能實現(xiàn)的功能谤饭,比如:Unittest中的測試用例和測試用例之間是無法傳遞參數(shù)和數(shù)據的标捺,但是Fixture卻可以解決這個問題。
Fixture 參數(shù)說明:
fixture(scope="function", params=None, autouse=False, ids=None, name=None):
入參說明:
- scope:表示被 @pytest.fixture() 裝飾器所標識方法的作用域揉抵。作用域有四個級別亡容,函數(shù) function(默認) ,類 class 功舀,模塊 module 萍倡,包 package/session 。說明:function 作用域包含函數(shù)和方法辟汰。
- params:一個可選的參數(shù)列表列敲,用于做 Fixture 的參數(shù)化阱佛。可將數(shù)據提供給其他的 Fixture 戴而,或者所有測試使用它 凑术。
- autouse:autouse=Ture 則開啟自動使用 Fixture 功能,也是調用 Fixture 函數(shù)一種方法所意。Fixture 裝飾器會自動執(zhí)行作用域范圍內的所有用例的前后置淮逊。autouse 默認值為 Flase 。
- ids:一個字符串 id 的列表扶踊,即當使用params參數(shù)化時泄鹏,給每一個值設置一個變量名。如果沒有提供 ID 秧耗, params 將自動生成 ID 备籽。
- name:表示給被 @pytest.fixture() 裝飾器修飾的方法取一個別名,調用時可以使用別名調用分井。默認為裝飾器所裝飾的函數(shù)名稱车猬。
注:Fixture裝飾器既可以實現(xiàn)部分用例的前后置,也可以是現(xiàn)實全部用例的前后置尺锚。
import pytest
# 1.py
@pytest.fixture(scope='module', autouse=True)
def test1():
print('\n開始執(zhí)行module')
@pytest.fixture(scope='class', autouse=True)
def test2():
print('\n開始執(zhí)行class')
@pytest.fixture(scope='function', autouse=True)
def test3():
print('\n開始執(zhí)行function')
def test_a():
print('---用例a執(zhí)行---')
def test_d():
print('---用例d執(zhí)行---')
class TestCase:
def test_b(self):
print('---用例b執(zhí)行---')
def test_c(self):
print('---用例c執(zhí)行---')
if __name__ == '__main__':
pytest.main(['-s', '1.py'])
輸出結果:
collected 4 items
1.py
開始執(zhí)行module
開始執(zhí)行class
開始執(zhí)行function
---用例a執(zhí)行---
.
開始執(zhí)行class
開始執(zhí)行function
---用例d執(zhí)行---
.
開始執(zhí)行class
開始執(zhí)行function
---用例b執(zhí)行---
.
開始執(zhí)行function
---用例c執(zhí)行---
.
============================== 4 passed in 0.04s ==============================
05 跳過(Skip)及預期失斨槿颉(xFail)
根據特定條件,不執(zhí)行標識的測試函數(shù)瘫辩。
- 方法:
skipif(condition, reason=None)
- 參數(shù):
- condition:跳過的條件伏嗜,必傳參數(shù)
- reason:標注原因,必傳參數(shù)
- 使用方法:
@pytest.mark.skipif(condition, reason="xxx")
跳過執(zhí)行測試函數(shù)
-
pytest.mark.skip(reason=" ")
可傳入一個非必須參數(shù)reason表示原因
自定義@pytest.mark.skip()標簽
- skip_test = pytest.mark.skip() 或 myskip = pytest.mark.skipif(condition=...)
- 裝飾時用該變量代替標簽即可:@skip_test
標記為預期失敗函數(shù)
- 方法:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
- 常用參數(shù):
- condition:預期失敗的條件杭朱,必傳參數(shù)
- reason:失敗的原因阅仔,必傳參數(shù)
- 使用方法:
- @pytest.mark.xfail(condition, reason="xx")
使用xfail標記指示你希望測試失敗吹散。運行用例的時候弧械,在失敗時不會報告回溯。相反,終端報告會將其列在“預期失敗”(XFAIL)或“意外傳遞”(XPASS)部分中空民。
06 裝飾器之 mark
函數(shù)數(shù)據參數(shù)化刃唐,方便測試函數(shù)對測試數(shù)據的獲取。
- 方法:
- parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
- 常用參數(shù):
- argnames:參數(shù)名
- argvalues:參數(shù)對應值界轩,類型必須為list
當參數(shù)為一個時格式:[value]
當參數(shù)個數(shù)大于一個時画饥,格式為:[(param_value1,param_value2.....), (param_value1,param_value2.....)]
- 使用方法:
- @pytest.mark.parametrize(argnames,argvalues),參數(shù)值為N個浊猾,測試方法就會運行N次
07 pytest 參數(shù)
- -K EXPRESSION:執(zhí)行某個關鍵字的用例抖甘,用例要匹配給出的表達式;使用python的語法葫慎,匹配的范圍是文件名衔彻、類名薇宠、函數(shù)名為變量,用and來區(qū)分艰额。
- --maxfail=num:當錯誤個數(shù)到達給定數(shù)時澄港,退出測試,這里就不列舉實例了柄沮,結果與-x類似回梧。
- -m MARKEXPR:只能運行有相應標識的測試用例,使用這個參數(shù)祖搓,測試用例要使用@pytest.mark.marker修飾狱意。
- -v:詳細結果
- -q:極簡結果顯示,簡化控制臺的輸出
- -s:輸入我們用例中的調式信息拯欧,比如print的打印信息等
- -V:可以輸出用例更加詳細的執(zhí)行信息髓涯,比如用例所在的文件及用例名稱等
- --junit-xml=path:輸出xml文件格式,在與jenkins做集成時使用
- --result-log=path:將最后的結果保存到本地文件中