1.前言
在工作中我們經常使用@pytest.mark.XXXX進行裝飾器修飾,后面的XXX的不同,在pytest中有不同的作
用,其整體使用相對復雜,我們單獨將其抽取出來做詳細的講解。
2.@pytest.mark.skip()/skipif()跳過用例
import pytest
#無條件跳過:@pytest.mark.skip 或者@pytest.mark.skip(reason='XXXXXX');狀態為:
SKIPPED
@pytest.mark.skip()
def test_001():
print('test_001:無條件跳過')
#不滿足條件就不跳過,正常執行,通過為passed,不通過為failed
@pytest.mark.skipif(1==2,reason='條件成立的時候跳過,不成立的時候不跳過')
def test_002():
print('test_002:條件不成立不跳過')
#滿足條件就就跳過,并給出跳過的原因:狀態為SKIPPED
@pytest.mark.skipif(1==1,reason='條件成立的時候跳過,不成立的時候不跳過')
def test_003():
print('test_003:條件成立,跳過')
3.xfail標記用例結果
當由于確切的原因,我們指定某個用例執行會失敗,如:用例覆蓋的功能還未完成、用例測試時被阻塞
等時,可以使用xfail將用例標記起來。
3.1 xfail的裝飾器用法
3.1.1 @pytest.mark.xfail不帶參數用法
import pytest
'''
使用@pytest.mark.xfail標記用例,表示期望這個用例執行失敗。
標記后的用例會正常執行,只是失敗時不再顯示堆棧信息,最終的結果有兩個:
用例執行失敗時(XFAIL:符合預期的失敗)、用例執行成功時(XPASS:不符合預期的成功)
'''
#通過狀態為Xpass:表示不符合預期的成功
@pytest.mark.xfail
def test_004():
assert 1==1
#不通過狀態為Xfail:表示符合預期的失敗
@pytest.mark.xfail
def test_005():
assert 1==2
3.1.2 @pytest.mark.xfail()帶參數用法
import pytest
'''
pytest.mark.xfail(condition=None, reason=None, strict=False, raises=None,
run=True)
condition位置參數,默認值為None,表示只有滿足條件時才標記用例,不滿足條件不標記用例
reason關鍵字參數,默認值為None,表示可以指定一個reason字符串,說明標記用例的原因;
strict關鍵字參數,默認值為False:
當strict=False時,如果用例執行失敗,結果標記為XFAIL,表示符合預期的失敗;如果用例執行成功,結
果標記為XPASS,表示不符合預期的成功;
當strict=True時,無論用例是否執行成功,結果都將標記為FAILED;
raises關鍵字參數,默認值為None:
可以指定為一個異常類或者多個異常類的元組,表示我們期望用例上報指定的異常;
如果用例的失敗不是因為所期望的異常導致的,pytest將會把測試結果標記為FAILED;
run關鍵字參數,默認值為True:
當run=False時,pytest不會再執行測試用例,直接將結果標記為XFAIL;
'''
@pytest.mark.xfail(condition=1==2,reason='條件不成立,用例不會被標記')
def test_004():
assert 1==1 #條件不成立,用例不會被標記,test_004正常執行,成功passed
@pytest.mark.xfail(condition=1==2,reason='條件不成立,用例不會被標記')
def test_005():
assert 1!=1 #條件不成立,用例不會被標記,test_005正常執行,失敗failed
@pytest.mark.xfail(condition=1!=2,reason='條件成立,用例被標記')
def test_006():
assert 1==1 #條件成立,用例被標記,執行成功狀態標記為XPASS
@pytest.mark.xfail(condition=1!=2,reason='條件成立,用例被標記')
def test_007():
assert 1==2 #條件成立,用例被標記,執行失敗狀態標記為XFAIL
@pytest.mark.xfail(condition=1!=2,reason='條件成立,用例被標記',strict=True)
def test_008():
print('strict=True,無論用例執行成功還是失敗,狀態均標記為failed')
#assert 1==1
#assert 1==2
@pytest.mark.xfail(condition=1!=2,reason='條件成立,用例被標記',strict=True,raises=
(ZeroDivisionError,))
def test_009():
print(1/0) #用例執行失敗,導致失敗的原因為期望的異常導致,用例結果標記為XFAIL
assert 1 == 1 #用例執行成功,直接標記為Failed
# assert 1 != 1 #用例執行失敗,導致失敗的原因不為期望的異常導致,用例結果標記為Failed
@pytest.mark.xfail(condition=1!=2,reason='條件成立,用例被標記',strict=True,raises=
(ZeroDivisionError,),run=False)
def test_010():
print('run=False,不允許用例,直接標記用例為XFAIL')
print(1/0)
3.2 xfail的非裝飾器用法
可以通過pytest.xfail方法在用例執行過程中直接標記用例結果為XFAIL,并跳過剩余的部分
4.@pytest.mark.標記
關于執行被標記的用例,這個在上一講,已經講過,這里不再累述
5.@pytest.mark.parametrize()進行參數化
import pytest
import yaml
#傳遞多個參數,多個參數,多個參數名稱寫入一個字符串,值寫入一個容器,容器內分別為對應參數的值
@pytest.mark.parametrize('a,b',[(1,2),(3,4)])
def test_001(a,b):
print(a,b)
#傳遞一個參數,這個參數的多組值寫入一個容器
@pytest.mark.parametrize('kwargs',[{'k':'v1'},{'k':'v2'}])
def test_002(kwargs):
print(kwargs['k'])
#yaml文件傳值,這種方式需要主要文件路徑的變化,如果有問題,可以寫文件的絕對路徑,一般結合
fixture使用好點
@pytest.mark.parametrize('kwargs',
yaml.safe_load(open('../data/login.yaml','r',encoding='utf-8')))
def test_003(kwargs):
print(kwargs)
if __name__ == '__main__':
pytest.main()
?執行結果如下:
?