全网最牛自动化测试框架系列之pytest(9)-标记用例(指定执行、跳过用例、预期失败)_pytest

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

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”])

运行结果如下:

从结果可以看出来,这里只运行了标记为smokeorder的测试用例。

标记跳过

有时候我们需要跳过某些测试用例不去执行,如代码更新后老的用例不需要执行了,或者在某些特定场景下不需要执行某些用例,这时就需要给对应的测试用例做标记跳过处理。

pytest中提供了两种标记跳过的方法,如下:

  1. 直接跳过,@pytest.mark.skip(reason="跳过原因"),reason可写可不写。
  2. 条件跳过,即满足某个条件则跳过不执行,@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),参数说明如下:

  1. condition,预期失败的条件,默认值为None,表示只有满足条件时才标记用例为预期失败。
  2. reason,失败原因,默认值为None,说明标记用例的原因。
  3. strict关键字参数,默认值为False。

当 strict=False 时,如果用例执行失败,则结果标记为xfail,表示符合预期的失败;如果用例执行成功,结果标记为XPASS,表示不符合预期的成功;

当strict=True时,如果用例执行成功,结果将标记为failed。
4. raises关键字参数,默认值为None,可以上报指定的一个或多个异常。如果用例的失败不是因为所期望的异常导致的,pytest将会把测试结果标记为failed。
5. 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’])

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
if name == ‘main’:
pytest.main([‘-s’])

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-B5BcBl3Y-1713464119887)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值