1. 前言
在工作中我们经常使用@pytest.mark.XXXX进行装饰器修饰,后面的XXX的不同,在pytest中有不同的作
用,其整体使用相对复杂,我们单独将其抽取出来做详细的讲解。
[email protected]()/skipif() 跳过用例
python
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 不带参数用法
python
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() 带参数用法
python
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,并跳过剩余的部分

关于执行被标记的用例,这个在上一讲,已经讲过,这里不再累述
[email protected]() 进行参数化
python
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()
执行结果如下:
