Pytest-mark使用详解(跳过、标记、参数 化)

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()

 执行结果如下:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员的世界你不懂

你的鼓励将是我创造的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值