前言
關于pytest就不多做介紹了,目前很多公司都在用的框架,選用該框架的理由很多啦,比如:
- 容易上手,入門簡單,文檔豐富,支持的第三方插件很多,文檔中示例也很詳細
- 支持運行node/unittest編寫的測試腳本
- 支持失敗重跑
- 支持參數(shù)化
- 執(zhí)行指定執(zhí)行某些case
等等
這次主要記錄一些比較實用的插件實踐操作。
關于pytest的第三方插件,截止寫下這些文字時,一共579個,詳情可見plugins。

實用的插件介紹
1.pytest安裝
pip install -U pytest
個人比較建議安裝3.8.0版本。
2.多重校驗 pytest-assume
簡單的校驗assert,雖然可以寫多個assert
def test_add1(self):
assert add(2,3)==5
assert add(1,3)==3
assert add(2,5)==7
由于第二個斷言失敗,那么下面的斷言就不會執(zhí)行。
所以如果需要多個斷言,都執(zhí)行就需要第三方插件 pytest-assume
安裝命令:
pip install pytest-assume
示例:
def test_add2(self):
pytest.assume(add(1,2)==3)
pytest.assume(add(1,4)==3)
pytest.assume(add(2,2)==4)
這邊即使第二個斷言失敗了,第三個斷言還是會繼續(xù)執(zhí)行。
3.設定執(zhí)行順序 pytest-ordering
對于一些上下文依賴的,有時候可能需要設定一些特定執(zhí)行順序,pytest的ordering插件,就很好的解決了這個問題
安裝命令
pip install pytest-ordering
示例腳本如下:
def test_order1():
print ("first test")
assert True
def test_order2():
print ("second test")
assert True
沒有加上ordering,執(zhí)行順序是 test_order1----test_order2,如圖:

加上順序之后
@pytest.mark.run(order=2)
def test_order1():
print ("first test")
assert True
@pytest.mark.run(order=1)
def test_order2():
print ("second test")
assert True
結(jié)果如下:

對比可以看出,執(zhí)行順序發(fā)生了變化
4.失敗重跑 pytest-rerunfailures
失敗用例重跑,個人覺得這個是非常實用的插件。
舉個例子:
在做UI自動化,如selenuim或者appium時,遇到某些元素未能及時顯示,導致點擊失敗,如果加上重跑,那么將有效提高報告的準確性。
安裝命令:
pip install pytest-rerunfailures
示例腳本
class TestRerun():
@pytest.mark.run(order=2)
@pytest.mark.flaky(reruns=5)
def test_random(self):
print(1)
pytest.assume((random.randint(0,4)+3)==5)
@pytest.mark.run(order=3)
def test_random2(self):
'''
不加mark 命令行中
pytest -sq demo_rerun.py --reruns 5
:return:
'''
print(2)
pytest.assume((random.randint(0,4)+3)==5)
@pytest.mark.run(order=1)
@pytest.mark.flaky(reruns=6, reruns_delay=2)
def test_example(self):
print(3)
assert random.choice([True, False])
詳細的可以參考Github
執(zhí)行命令:
pytest -sq demo_rerun.py --reruns 5
pytest -sq demo_rerun.py --reruns 5 --reruns-delay 1
二者的區(qū)別是,下面在每次重跑之前會等待 1 s
同時也可以在腳本中指定定義重跑的次數(shù),這個時候在運行的時候,就無需加上 --reruns 這個參數(shù)
@pytest.mark.flaky(reruns=6, reruns_delay=2)
def test_example(self):
print(3)
assert random.choice([True, False])

5.顯示進度條 pytest-sugar
個人覺得功能上這個插件,并沒有什么作用,可能更大的作用是心理上的,在調(diào)試的時候,可以顯示執(zhí)行的進度。
安裝命令
pip install pytest-sugar
運行的時候無需其他的參數(shù),會自動顯示整體的進度

5.覆蓋率 pytest-cov
單元測試過程中,有一個很重要的指標:行覆蓋率
pytest-cov 這個插件就很好顯示覆蓋率
安裝命令:
pip install pytest-cov
執(zhí)行命令
pytest --cov=../../xpinyin demo_cov.py
其中--cov 后面帶上需要檢查覆蓋率的路徑
結(jié)果為:

以上所有實踐demo可以參考github