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

1. 前言

在工作中我们经常使用@pytest.mark.XXXX进行装饰器修饰,后面的XXX的不同,在pytest中有不同的作

用,其整体使用相对复杂,我们单独将其抽取出来做详细的讲解。

2.@pytest.mark.skip()/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,并跳过剩余的部分

4.@pytest.mark. 标记

关于执行被标记的用例,这个在上一讲,已经讲过,这里不再累述

5.@pytest.mark.parametrize() 进行参数化

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

执行结果如下:

相关推荐
一半烟火以谋生10 小时前
Python + Pytest + Allure 自动化测试报告教程
开发语言·python·pytest
一半烟火以谋生2 天前
pytest conftest.py 使用教程
pytest
我的xiaodoujiao2 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 19--测试框架Pytest基础 3--前后置操作应用
python·学习·测试工具·pytest
鱼鱼说测试2 天前
pytest+yaml+allure接口自动化测试框架
pytest
ThreeAu.5 天前
pytest 实战:用例管理、插件技巧、断言详解
python·单元测试·pytest·测试开发工程师
我的xiaodoujiao5 天前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 18--测试框架Pytest基础 2--插件和参数化
python·学习·测试工具·pytest
小小测试开发6 天前
pytest 库用法示例:Python 测试框架的高效实践
开发语言·python·pytest
know__ledge6 天前
Pytest+requests进行接口自动化测试8.0(Allure进阶 + 文件上传接口 + 单接口多用例)
pytest
川石课堂软件测试6 天前
CSS中常用的几种定位。
开发语言·css·python·网络协议·http·html·pytest
啊森要自信7 天前
【GUI自动化测试】Python 自动化测试框架 pytest 全面指南:基础语法、核心特性(参数化 / Fixture)及项目实操
开发语言·python·ui·单元测试·pytest