pytest(9)-标记用例(指定执行、跳过用例、预期失败)
pytest中提供的mark
模块,可以实现很多功能,如:
- 标记用例,即打标签
skip
、skipif
标记跳过,skip
跳过当前用例,skipif
符合情况则跳过当前用例xfail
标记为预期失败
标记用例
有时候我们可能并不需要执行项目中的所有用例,而只执行其中的某些用例,即指定执行某一类或某个场景的测试用例,比如只执行冒烟用例,那么这个时候就需要使用@pytest.mark.标签名
来进行打标签过滤。标签名
需要先注册,然后才能使用。
注册标签
官方文档里提供了三种注册标签的方法,这里只介绍pytest.ini
及conftest.py
,有兴趣的可以去查看官方文档。
方法一,在项目根目录新建pytest.ini
,并在其中注册、管理标签。示例如下:
[pytest]
markers =
smoke: marks test as smoke
login
order: 下单场景
这里定义了三个标签,分别是:smoke、login、order,冒号后面的是标签说明,可不加。
方法二,在conftest.py
中定义钩子函数进行标签注册,格式如下:
def pytest_configure(config):
marker_list = [
"smoke: marks test as smoke",
"login",
"order: 下单场景"
]
for marker in marker_list:
config.addinivalue_line("markers", marker)
方法二需注意定义的格式,不能轻易修改函数名及入参。
使用方法
import pytest
# 标记测试函数
@pytest.mark.smoke
def test_01():
print("执行test_01")
def test_02():
print("执行test_02")
# 标记测试类
@pytest.mark.order
class TestOrder:
def test_order(self):
print("下单")
def test_pay(self):
print("支付")
# 多个标签
@pytest.mark.smoke
@pytest.mark.login
def test_login():
print("登录")
给测试类打标签,还有另外一种方式,如下:
# 标记测试类(单个标签)
class TestOrder:
# 给类中的所有测试方法打上order标签
pytestmark = pytest.mark.order
def test_order(self):
print("下单")
def test_pay(self):
print("支付")
# 标记测试类(多个标签)
class TestOrder:
# 给类中的所有测试方法打上order、smoke标签
pytestmark = [pytest.mark.order, pytest.mark.smoke]
def test_order(self):
print("下单")
def test_pay(self):
print("支付")
同样可以使用pytestmark
标记模块,给模块中所有的测试类、测试函数打上标签,如下:
import pytest
# 模块中的所有测试函数、测试类都会被打上order、smoke标签
pytestmark = [pytest.mark.order, pytest.mark.smoke]
def test_01():
print("执行test_01")
def test_02():
print("执行test_02")
class TestOrder:
def test_order(self):
print("下单")
def test_pay(self):
print("支付")
执行方法
执行的时候加上参数-m
加标签名
即可。
命令行:
# 执行被标记为smoke的用例
pytest -m smoke
# 执行被标记为smoke且被标记为login的用例
pytest -m "smoke and login"
# 执行被标记为smoke或login的用例
pytest -m "smoke or login"
代码执行:
# 执行被标记为smoke的用例
pytest.main(['-m smoke'])
# 执行被标记为smoke或order的用例
pytest.main(["-m", "smoke or order"])
# 执行被标记为smoke同时被标记为login的用例
pytest.main(["-m", "smoke and login"])
# 执行被标记为smoke且不被标记为login的用例
pytest.main(["-m", "smoke and not login"])
这里需要注意,在测试模块中直接使用pytest.main()
执行当前模块中的被打标签的用例是无效的,这样会执行当前模块中的所有测试用例。如下示例:
import pytest
# 标记测试函数
@pytest.mark.smoke
def test_01():
print("执行test_01")
def test_02():
print("执行test_02")
# 标记测试类
@pytest.mark.order
class TestOrder:
def test_order(self):
print("下单")
def test_pay(self):
print("支付")
# 多个标签
@pytest.mark.smoke
@pytest.mark.login
def test_login():
print("登录")
if __name__ == '__main__':
pytest.main(['-s', '-m smoke'])
运行该模块,结果如下:
从结果中可以看出,虽然代码中写了只执行标记为smoke
的用例,但所有5条用例都被执行了,不能进行过滤。
我们需要将执行代码分离出来,放在单独的执行模块里面,如放在run.py
里,代码如下:
# run.py
import pytest
if __name__ == '__main__':
pytest.main(["-s", "-m", "smoke or order"])
运行结果如下:
从结果可以看出来,这里只运行了标记为smoke
或order
的测试用例。
标记跳过
有时候我们需要跳过某些测试用例不去执行,如代码更新后老的用例不需要执行了,或者在某些特定场景下不需要执行某些用例,这时就需要给对应的测试用例做标记跳过处理。
pytest中提供了两种标记跳过的方法,如下:
- 直接跳过,
@pytest.mark.skip(reason="跳过原因")
,reason可写可不写。 - 条件跳过,即满足某个条件则跳过不执行,
@pytest.mark.skipif(b>3, reason="跳过原因")
示例如下:
import pytest
@pytest.mark.skip(reason="不需要执行test_01")
def test_01():
print("执行test_01")
@pytest.mark.skip(2>1, reason="如果2大于1则跳过不执行")
def test_02():
print("执行test_02")
if __name__ == '__main__':
pytest.main(['-s'])
运行结果:
从运行结果中可以看到,这2条用例都被跳过。如果想要 跳过测试类 或 测试模块,方法同上面给测试类、测试模块打标签的方法一样,不做过多说明。
xfail
有些场景下需要将测试用例标记为预期失败,如对尚未实现的功能或尚未修复的错误进行测试,使用@pytest.mark.xfail
可以将测试用例标记为预期失败。
pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
,参数说明如下:
condition
,预期失败的条件,默认值为None,表示只有满足条件时才标记用例为预期失败。reason
,失败原因,默认值为None,说明标记用例的原因。strict
关键字参数,默认值为False。当 strict=False 时,如果用例执行失败,则结果标记为
xfail
,表示符合预期的失败;如果用例执行成功,结果标记为XPASS,表示不符合预期的成功;当strict=True时,如果用例执行成功,结果将标记为failed。
raises
关键字参数,默认值为None,可以上报指定的一个或多个异常。如果用例的失败不是因为所期望的异常导致的,pytest将会把测试结果标记为failed。run
关键字参数,默认值为True。当run=False时,pytest不会再执行测试用例,直接将结果标记为xfail。
常用的参数示例如下:
import pytest
# run、strict都为默认,因为用例执行是失败的,所以该用例执行结果会被标记为xfail
@pytest.mark.xfail(reason="bug待修复")
def test_01():
print("执行test_01")
a = "hello"
b = "hi"
assert a == b
# run、strict都为默认,因为用例执行是通过的,所以该用例执行结果会被标记为xpass
@pytest.mark.xfail(condition=lambda: True, reason="bug待修复")
def test_02():
print("执行test_02")
a = "hello"
b = "hi"
assert a != b
# run=False,该用例不执行,直接将结果标记为xfail
@pytest.mark.xfail(reason="功能尚未开发完成", run=False)
def test_03():
print("执行test_03")
a = "hello"
b = "hi"
assert a == b
# strict=True,因为用例执行是通过的,所以结果会被标记为failed
@pytest.mark.xfail(reason="功能尚未开发完成", strict=True)
def test_04():
print("执行test_04")
a = "hello"
b = "he"
assert b in a
if __name__ == '__main__':
pytest.main(['-s'])
运行结果:
从结果中可以看出来,test_01
结果展示为xfail
,test_02
结果展示为xpass
,test_03
没有执行而是直接展示为xfail
,test_04
结果展示为failed
总结
以上示例仅仅只是为了说明@pytest.mark
提供的这些功能的使用方法,实际自动化过程中需要灵活选用。
在一般的自动化测试过程中,通过打标签的方式标记某个场景用例会比较多,如标记冒烟测试用例用于冒烟测试。跳过或条件跳过测试用例也经常会用到。而需要将用例标记为预期失败的场景则比较少。
pytest(9)-标记用例(指定执行、跳过用例、预期失败)的更多相关文章
- python:unittest之跳过测试和预期失败的用例
在利用单元测试框架执行测试用例的过程中,有时只需要执行一部分用例,或者跳过某些暂不需要执行的用例,python的unittest框架就内置这样的功能. 前面的博客介绍了unittest框架的测试用例加 ...
- python--selenium多线程执行用例实例/执行多个用例
python--selenium多线程执行用例实例/执行多个用例 我们在做selenium测试的时候呢,经常会碰到一些需要执行多个用例的情况,也就是多线 程执行py程序,我们前面讲过单个的py用例怎么 ...
- Python+selenium之跳过测试和预期失败
在运行测试时,需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest单元测试框架提供了实现这些需求的装饰器. 1.unittest.skip(re ...
- unittest跳过测试和预期失败
在运行测试时,有时需要直接跳过某些测试用例,或者当用例符合某个条件时跳过测试,又或者直接将测试用例设置为失败.unittest提供了这些需求的装饰器. unittest.skip(reason) 无条 ...
- python单元测试框架-unittest(五)之跳过测试和预期失败
概要 @unittest.skip(reason): skip(reason)装饰器:直接跳过测试,并说明跳过测试的原因. @unittest.skipIf(reason): skipIf(condi ...
- Pytest权威教程12-跳过(Skip)及预期失败(xFail): 处理不能成功的测试用例
目录 跳过(Skip)及预期失败(xFail): 处理不能成功的测试用例 Skip跳过用例 xFail:将测试函数标记为预期失败 Skip/xFail参数设置 返回: Pytest权威教程 跳过(Sk ...
- 『德不孤』Pytest框架 — 7、Pytest预期失败
目录 1.@pytest.mark.xfail()标记的作用 2.应用场景 3.语法参数说明 4.示例 5.忽略xfail标识 Pytest预期失败需要使用@pytest.mark.xfail()标记 ...
- pytest八:skip 跳过用例
这是一个快速指南,介绍如何在不同情况下跳过模块中的测试1.无条件地跳过模块中的所有测试:pytestmark = pytest.mark.skip("all tests still WIP& ...
- Pytest系列(7) - skip、skipif跳过用例
如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 pytest.mark.sk ...
随机推荐
- Golang中Label的用法
在Golang中能使用Label的有goto, break, continue.,这篇文章就介绍下Golang中Label使用和注意点. 注意点: Label在continue, break中是可选的 ...
- Go语言系列之函数
函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数 ...
- 用户注册调优 及Connection对象
调优的方法: (1)减少Connection对象的销毁与创建 我们可以在服务器启动时 预先创建好二十个Connection对象 因为每次Coonection对象的创建与销毁会浪费大量的时间 我们需要 ...
- 理解Cookie和Session机制,及其安全问题
大家常说"Cookie保存在客户端而Session保存在服务端",很多人看了有疑惑,明明Session就在Cookie中啊,为什么这么说?二者到底有啥区别? 一.Cookie 首先 ...
- 机器学习&恶意代码静态检测
目录 分析工具 方法概述 二进制灰度图 字节(熵)直方图 字符串信息 ELF结构信息 源码分析与OPcode FCG references: 分析工具 readelf elfparser ninja ...
- 模拟axios的创建[ 实现调用axios()自身发送请求或调用属性的方法发送请求axios.request() ]
1.axios 函数对象(可以作为函数使用去发送请求,也可以作为对象调用request方法发送请求) ❀ 一开始axios是一个函数,但是后续又给它添加上了一些属性[ 方法属性] ■ 举例子(axio ...
- 【记录一个问题】tesla model 3在行驶1000公里后,行驶中踩下刹车出现告警“同时踩下制动踏板和电门”
问题的描述如下:1.行驶1000公里左右后出现,之前没有:2.超过一定速度后再踩刹车出现此告警,如果低速环境频繁起停则不会出现:3.告警的意思是使用者同时踩下了刹车和电门,第一次电话客服反馈--检查脚 ...
- 深度解读SSH免密登录
深度解读SSH免密登录 我们都知道SSH是LINUX下很常用的命令,用来远程登陆其他的LINUX系统.如果只有一台,那也只是一个密码 ,也到还好.但如果是一个集群,每次都输入密码登录,难免会拉低效率. ...
- 哪些是GET请求,哪些是POST请求
GET请求: 1,form标签 method=get 2,a标签 3,link标签引入css 4,Script标签引入js文件 5,img标签引入图片 6,iframe引入html页面 7,在浏览器地 ...
- java-包与包之间的访问
1 package face_package; 2 3 import face_packagedemoA.DemoA; 4 5 /* 包(package) 6 * 1,对类文件进行分类管理. 7 * ...