Pytest框架 —— 用例标记和测试执行篇!

pytest用例标记和测试执行篇

上一篇文章入门篇咱们介绍了pytest的前后置方法和fixture机制,这个章节主要给大家介绍pytest中的标记机制和用例执行的方法。pytest可以通过标记将数据传入于测试函数中,也可以通过标记中对执行的用例做筛选,接下来直接进入正题。

一、pytest中内置的标记

pytest标记使用需要通过pytest.mark.标记来使用,pytest中为应对各种测试场景也内置了很多的标记。

1.1、pytest.mark.parametrize:用例参数化的标记

通过parametrize可以将用例数据和用例执行的逻辑代码分离,并实现根据用例,自动生成测试用例。

Demo:
@pytest.mark.parametrize('item',[11,22,33,44,55,66])
def test_demo(item)
	assert item > 50

1.2、pytest.mark.skip:跳过用例执行

通过skip装饰的用例,在执行的时候会无条件跳过,

参数reason:跳过测试函数的原因。

Demo
# 不写跳过原因
@pytest.mark.skip
def test_demo()
	assert item > 50

# 写跳过原因
@pytest.mark.skip(reason='不需要执行')
def test_demo()
	assert item > 50

1.3、pytest.mark.skipif:根据条件跳过用例

skipif可以根据条件来决定是否跳过用例的执行, 如果条件为True则跳过测试函数执行。

参数 :condition —跳过的条件

参数 : reason —跳过的原因

Demo
a = 10
@pytest.mark.skipif(a > 20,reason='条件不成立,不执行')
def test_demo()
	assert item > 50
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】

1.4、pytest.mark.xfail:标记预期失败的用例

xfail可以将测试函数标记为预期执行失败的用例。

参数 :condition — 将测试函数标记为 xfail 的条件(True/False )

参数 : reason — 测试函数被标记为 xfail 的原因

参数 : raises — 预期失败的异常类型

参数 : run — 是否应该实际执行测试函数。如果False,该函数将始终 xfail 并且不会被执行 。

参数 : strict — 严格模式(True/False )

Demo
a = 10
@pytest.mark.xfail(a > 20,reason='条件不成立,不执行' raises=AssertionError )
def test_demo()
	assert item > 50

1.5、pytest.mark.usefixtures:给测试类或模块设置测试夹具

usefixtures标记一般用于给测试类下面的测试方法统一设置测试夹具。

Demo
# TestDome这个测试类的所有测试用例均执行my_fixture这个夹具
@pytest.mark.usefixtures('my_fixture这个夹具')
class TestDome:
    # 函数用例 指定测试夹具
    def test_02(self):
        print('----测试用例:test_01------')

    # 函数用例 指定测试夹具
    def test_03(self):
        print('----测试用例:test_02------')

二、自定义标记

pytest支持通过pytest.ini文件注册自定义的标记。以满足执行用例时,通过标记对用例进行筛选.,

2.1、注册标记

pytest.ini文件注册标记的语法如下:
[pytest]

markers =
    标记1
    标记2

2.2、标记函数

Demo:
# 用例前面加载标签:@pytest.mark.标签名  
@pytest.mark.main
 def test_demo():
    pass

2.3、标记类

Demo:
# 方式一:直接类上面打标记
@pytest.mark.main
class TestClass(object):
    def test_demo1(self):
        assert 10 > 20
  
# 方式二:通过类属性pytestmark,可以同时添加多个标记
class TestClass(object):
    pytestmark = [pytest.mark.main, pytest.mark.main]
  
    def test_demo1(self):
        assert 10 > 20

三、通过标记筛选用例执行

Demo:现有用例如下:
import pytest

@pytest.mark.yuze
@pytest.mark.musen
def test_01():
    print("用例一")

def test_02():
    print("用例二")

@pytest.mark.musen
def test_03():
    print("用例三")

@pytest.mark.musen
def test_04():
    print("用例四")

@pytest.mark.yuze
def test_05():
    print("用例五")

@pytest.mark.yuze
def test_06():
    print("用例六")

上面Demo中有6条测试用例,分别通过pytest.mark.yuze和pytest.mark.musen进行标记了,接下来我们一起来看看如何通过标记选择用例执行。

3.1、通过单个标记筛选

语法:pytest -m '标签名'
Demo: pytest -m musen

执行结果如下:

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 3 deselected / 3 selected                                                                                                               
test_mode.py ...      [100%]
========================== 3 passed, 3 deselected in 0.29s ==========================

可以看到执行结果执行了3条用例,3条未选中。

3.2、同时选中多个标记

语法:pytest -m "标记1 or 标记2"

命令: pytest -m "musen ro yuze"

执行通过musen或者yuze 标记的的用例。执行结果如下:

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 1 deselected / 5 selected                                                                                                               
test_mode.py .....      [100%]
========================== 5 passed, 1 deselected in 0.29s ==========================

从上述结果可以看到,只要加了musen或yuze这两个标记中的任意一个

语法: pytest -m "标记1 and 标记2"

命令: pytest -m "musen and yuze"

执行通过musen和yuze这两个标记同时标记的用例。执行结果如下

========================== test session starts ==========================
platform win32 -- Python 3.7.3, pytest-5.4.2, py-1.8.0, pluggy-0.13.0
rootdir: C:\project\, inifile: pytest.ini
plugins: allure-pytest-2.8.15, Faker-8.11.0, metadata-1.9.0, parallel-0.0.8, repeat-0.8.0, rerunfailures-9.0, testreport-1.1.2
collected 6 items / 5 deselected / 1 selected                                                                                                               
test_mode.py .      [100%]
========================== 1 passed, 5 deselected in 0.29s ==========================

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

### 如何在 Pytest 框架中运行自动化测试 #### 使用命令行工具执行测试 为了方便开发者快速上手并高效地进行单元测试Pytest 提供了一种简单的方式通过命令行来发现执行测试。当直接执行 `RunTestCase.py` 文件时,Pytest 会自动查找当前工作目录及其子目录下的 Python 测试脚本文件——这些文件通常是以 `test_` 开头或是以 `_test.py` 结尾的文件[^2]。 ```bash pytest ``` 这条简单的命令即可启动整个项目的测试流程,它不仅能够识别上述命名模式的模块作为候选测试集的一部分,还会递归扫描所有符合条件的文件夹结构中的同名文件。 #### 利用 pytest.main() 函数定制化调用 对于更复杂的场景或希望集成到其他应用程序内的需求来说,则可以借助于内置函数 `pytest.main()` 来实现更加灵活可控的操作。下面给出的子展示了怎样显式指明要加载的具体测试文件路径以及设置一些常用的参数选项: ```python import pytest if __name__ == '__main__': pytest.main(['-vs', 'testcase_web/test_login.py']) ``` 这里 `-v` 参数用于增加输出信息量级;而 `-s` 可让标准输入/输出流保持开启状态以便捕获打印语句等内容[^3]。 #### 处理不稳定测试 (Flaky Tests) 有时由于环境因素或其他不可控变量的影响,某些特定条件下可能会遇到间歇性的失败情况(即所谓的 flaky tests)。针对这种情况,在编写测试代码时可以通过装饰器 `@pytest.mark.flaky` 来标记那些容易出现问题的地方,并允许它们多次尝试直到成功为止: ```python import pytest @pytest.mark.flaky(reruns=5) def test_example(): import random assert random.choice([True, False, False]) ``` 此段代码定义了一个名为 `test_example` 的测试方法,该方法会在初次失败后最多再重复四次,总共五轮的机会去验证其正确性[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值