mark
pytest提供了標記機制,允許你使用marker對測試函數做標記,一個測試函數可以有多個marker,一個marker也可以用來標記多個測試函數
比如我們需要進行冒煙測試,不可能把所有的用例都跑一遍,我們可以挑選一些重要的用例進行冒煙測試,為了把選定的測試加入冒煙測試,可以對他們添加@pytest.mark.smoke裝飾器。我們有兩個文件,里面分別放了兩個測試用例
test_demo.py
import pytest @pytest.mark.get def test_demo3(): print('我是tets demo 3') @pytest.mark.smoke @pytest.mark.get def test_demo4(): print('我是tets demo 4')
test_mark.py
import pytest @pytest.mark.get def test_demo1(): print('我是tets demo 1') @pytest.mark.smoke @pytest.mark.get def test_demo2(): print('我是tets demo 2')
我們可以看到,冒煙測試兩個文件里面各有一個,來使用-m參數執行一下,這樣我們標記的smoke的用例就被執行了,其他的沒有被執行
-m后面也可以使用表達式,可以在標記之間添加and,or,not關鍵字
跳過測試
要跳過某個測試,只需要簡單的在測試函數上方添加@pytest.mark.skip()裝飾器即可
比如下面的兩個測試用例,我們只想執行test_demo2,則我們可以給test_demo1加上裝飾器
import pytest @pytest.mark.skip() def test_demo1(): print('我是tets demo 1') def test_demo2(): print('我是tets demo 2')
skipif
我們可以給要跳過的測試添加理由和條件,這時應當使用skipif來替代skip
import pytest @pytest.mark.skipif(3<5, reason='版本不匹配') def test_demo1(): print('我是tets demo 1') def test_demo2(): print('我是tets demo 2')
前面的是個條件,可以是python的表達式,表達式的值為True時跳過,為false時執行。后面的是原因,在來執行一次
但我們仍然看不到跳過的原因,這時可以使用-rs
運行測試子集
運行測試有很多方式,不但可以選擇運行某個測試目錄、文件、類中的測試,還可以選擇運行某一個測試用例
運行單個目錄
運行單個目錄下的所有測試,以目錄作為pytest的參數即可
比如我testpytest目錄下有兩個測試文件,分別是test_demo.py和test_mark.py
運行單個測試文件
運行單個文件里的全部測試,以路徑名加文件名作為pytest參數即可
比如我們只想運行testpytest目錄下的test_demo.py文件
運行單個測試函數
運行單個測試函數,只需要在文件名后添加::符號和函數名
比如我們只想運行testpytest目錄下的test_demo.py文件里的test_demo3這個函數
運行單個測試類
與運行單個函數類似,只需要在文件名后面加上::符號和類名
import pytest class Test1(): def test_demo3(self): print('我是tets demo 3') def test_demo4(self): print('我是tets demo 4') class Test2(): def test_demo1(self): print('我是tets demo 1') def test_demo2(self): print('我是tets demo 2')
比如我們只想運行Test2的類
運行單個測試類中的測試方法
如果不希望運行測試類中的所有測試,只想指定運行其中一個,則在類名后面再加上::符號和方法名
用測試名划分測試集合
-k選項允許用一個表達式指定需要運行的測試,該表達式可以匹配測試名(或者子串)。表達式中可以包含and,or,not
def test_demo1(): print('我是tets demo 1') def test_demo2(): print('我是tets demo 2') def test_demo3(): print('我是tets demo 3') def test_parm(): print('我是tets parm')
如上代碼我們只想運行測試函數里面有demo的所有用例
參數化
可以使用 @pytest.mark.parametrize(argnames, argvalues) 裝飾器達到批量傳送參數的目的
parametrize()的第一個參數是用逗號分割的字符串列表,第二個參數是一個值列表
import pytest @pytest.mark.parametrize("a,b,c", [(1, 2, 3), (3, 2, 5), (4, 5, 9)]) def test_add(a, b, c): assert a + b == c