自动化测试框架pytest系列之8个常用的装饰器函数

news2024/9/28 9:20:55

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客  

自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客

自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)-CSDN博客

接上文 

3.5 pytest的8个装饰器

在之前的文章可以看到,fixture本身就是以装饰器的形式去使用的。但在pytest中,其实有很多的装饰器函数,接下来我们就捋一下有哪些装饰器 。

 

如果你自己发现 ,除了fixture本身 ,其他的都在mark后面进行标记 。所以这个mark非常重要 。

1.@pytest.fixture()

此功能应该是pytest中最核心和强大的功能 ,为了介绍此功能 ,本人足足写了1.8w字 。具体可查看链接 :自动化测试框架pytest到底都有哪些实用功能 ?pytest系列文章之fixture的介绍(一)。 - 知乎 (zhihu.com)

2.@pytest.mark.usefixtures()

  • 功能 :可以在测试用例中引入fixture的功能 ,

  • 格式 :@pytest.mark.usefixtures("fixture函数名"),其中参数必须传递fixture的函数名字 ,而且要用引号引起来 。

  • 区别 :和fixture()传递给测试用例的区别是 :

    • fixture:既可以将返回值传给测试用例,也可以无任何返回值,比如像上面的打印语句,本身不返回任何信息。

    • usefixture :无法将返回值的函数传递给测试用例 ,即测试用例只能接受无返回值的usefixture 。

  • 需求 :给登录的每条测试用例中添加一个打印信息,具体如下:


import pytest
from package_pytest.login import login


# fixture
@pytest.fixture()
def demo_fixture():
    print("这是一个fixture,要在每个方法执行前先运行")


# case1 : 输入正确的用户名和正确的密码进行登录
@pytest.mark.usefixtures('demo_fixture')
def test_login_success():
    print("1")
    expect_result = 0
    actual_result = login('admin','123456').get('code')
    assert expect_result == actual_result


# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.usefixtures('demo_fixture')
def test_password_is_wrong():
    print("2")
    expect_reesult = 3
    actual_result = login('admin','1234567').get('code')
    assert expect_reesult == actual_result


# case3 : 输入用户名和空的密码进行登录
@pytest.mark.usefixtures('demo_fixture')
def test_password_is_null():
    print("3")
    expect_reesult = 2
    actual_result = login('admin', '').get('code')
    assert expect_reesult == actual_result


if __name__ == '__main__':
    pytest.main(['test12_login_usefixtrues.py','-sv'])
  • 说明 :

    1. 定义了一个demo_fixture函数 ,其中这个函数想被测试用例调用 。

    2. 在调用的测试用例前加上@pytest.mark.usefixtures('demo_fixture') ,相当于把fixture函数传递给了测试用例了 。

    3. 所以 ,在测试用例运行就会先执行fixture函数内的代码了 。

以上代码运行结果为 :

3.@pytest.mark.parametrize

  • 功能 :可以专门为某条测试用例进行参数化 ,

  • 格式 :@pytest.mark.parametrize(参数,列表) ,其中参数主要为了传递给测试用例使用的,它接受的是字符串类型 。而列表是用来接收测试数据的。

  • 需求 :要将登录的4条测试数据传入给登录测试用来,该如何做 ,使用parametrize代码实现为 :

import pytest
from package_pytest.login import login

cases = [(0,'admin','123456'),(3,'admin','1234567'),(2,'admin',''),(1,'','123456')]


# case: 登录测试用例
@pytest.mark.parametrize("expect_result,username,password",cases)
def test_login_success(expect_result,username,password):
    print("1")
    actual_result = login(username,password).get('code')
    assert expect_result == actual_result

 对以上代码的说明 :

运行结果如下 :  

4.@pytest.mark.标识符

  • 功能 :可以做回归测试或者打包测试套件

  • 格式 :@pytest.mark.标识符 ,其中标识符可以是任何字符。

  • 说明:在测试用例中,我们经常通过用例级别代表用例的重要程度 ,比如会把用例设置为p1 , p2 ,p3 ,p4 .而在pytest中就可以mark进行标记 。

  • 需求 :对登录成功的用例标记为p1 ,对登录失败的用例标记为p2 ,具体代码如下 :

# case1 : 输入正确的用户名和正确的密码进行登录
@pytest.mark.p1
def test_login_success():
    print("1")
    expect_result = 0
    actual_result = login('admin','123456').get('code')
    assert expect_result == actual_result


# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.p2
def test_password_is_wrong():
    print("2")
    expect_reesult = 3
    actual_result = login('admin','1234567').get('code')
    assert expect_reesult == actual_result


# case3 : 输入用户名和空的密码进行登录
@pytest.mark.p2
def test_password_is_null():
    print("3")
    expect_reesult = 2
    actual_result = login('admin', '').get('code')
    assert expect_reesult == actual_result
    

if __name__ == '__main__':
    pytest.main(['test08_login_mark.py','-sv','-m','p1'])

可以看到 ,我们在main函数中传入了-mp1 ,就代表只运行mark中标记为p1级别的用例 ,这样就实现了部分用例的执行。

运行结果如下 :

5.@pytest.mark.skip

  • 功能 :用例跳过,比如某条用例暂时失败了,但是找不到原因 ,可以先标记为跳过 。

  • 格式 :@pytest.mark.skip(reason) ,这里的reason就是跳过的原因

  • 需求 :对登录成功的用例标记为跳过,在执行的时候不运行 ,具体代码如下 :


import pytest
from package_pytest.login import login


# case1 : 输入正确的用户名和正确的密码进行登录
@pytest.mark.skip(reason="用例运行失败,暂时找不到失败原因,跳过该用例执行。")
def test_login_success():
    print("1")
    expect_result = 0
    actual_result = login('admin','123456').get('code')
    assert expect_result == actual_result


# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.p2
def test_password_is_wrong():
    print("2")
    expect_reesult = 3
    actual_result = login('admin','1234567').get('code')
    assert expect_reesult == actual_result


# case3 : 输入用户名和空的密码进行登录
@pytest.mark.p2
def test_password_is_null():
    print("3")
    expect_reesult = 2
    actual_result = login('admin', '').get('code')
    assert expect_reesult == actual_result


if __name__ == '__main__':
    pytest.main(['test09_login_skip.py','-sv'])

 运行代码如下 :

6.@pytest.mark.skipif

  • 功能 :选择性跳过用例,条件为True才会跳过 。

  • 格式 :@pytest.mark.skipif(表达式) ,这里只能做一些简单的判断。

  • 说明 :和skip相比 ,只要标记为skip,此用例就会跳过,而标记为skipif的话,这里有个判断,只有为ture的情况下才会跳过 。

  • 需求 :对登录成功的用例标记选择性跳过,符合条件的将跳过该用例 ,具体代码如下 :

import pytest
from package_pytest.login import login
import sys


# case1 : 输入正确的用户名和正确的密码进行登录
@pytest.mark.skipif(sys.platform == "win32",reason="是windows平台的跳过")
def test_login_success():
    print("1")
    expect_result = 0
    actual_result = login('admin','123456').get('code')
    assert expect_result == actual_result


# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.skipif(sys.version_info <(3,6),reason="低于3.6版本的跳过")
def test_password_is_wrong():
    print("2")
    expect_reesult = 3
    actual_result = login('admin','1234567').get('code')
    assert expect_reesult == actual_result


# case3 : 输入用户名和空的密码进行登录
@pytest.mark.skipif(sys.version_info >=(3,6),reason="大于等于3.6版本的跳过")
def test_password_is_null():
    print("3")
    expect_reesult = 2
    actual_result = login('admin', '').get('code')
    assert expect_reesult == actual_result


if __name__ == '__main__':
    pytest.main(['test10_login_skipif.py','-sv'])

因为我的Python版本是3.6.4 ,故第二条用例不会被跳过,运行结果如下 :

7.@pytest.mark.xfail

  • 功能 :标记为失败用例,表示期望这个用例执行失败。

  • 格式 :@pytest.mark.xfail(表达式,reason) ,表达式为True,标记为失败用例。

  • 说明 :和skipif相比,skipif表达式为真,跳过用例执行,而标记xfail的话,表达式为真,则标记为失败 。

  • 需求 :对登录用例中符合条件的都标记为失败用例 ,具体代码如下 :


import pytest
from package_pytest.login import login
import sys


# case1 : 输入正确的用户名和正确的密码进行登录
@pytest.mark.xfail(sys.platform == "win32",reason="是windows平台的跳过")
def test_login_success():
    print("1")
    expect_result = 0
    actual_result = login('admin','123456').get('code')
    assert expect_result == actual_result


# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.xfail(sys.version_info <(3,6),reason="低于3.6版本的标记为失败")
def test_password_is_wrong():
    print("2")
    expect_reesult = 3
    actual_result = login('admin','1234567').get('code')
    assert expect_reesult == actual_result


# case3 : 输入用户名和空的密码进行登录
@pytest.mark.xfail(sys.version_info >=(3,6),reason="大于等于3.6版本的标记为什么")
def test_password_is_null():
    print("3")
    expect_reesult = 20
    actual_result = login('admin', '').get('code')
    assert expect_reesult == actual_result


if __name__ == '__main__':
    pytest.main(['test11_login_xfail.py','-sv'])

 运行结果如下 :

以上是正常的运行结果 ,如果你只想运行失败的用例,你可以加入该选项'--runxfail' .  

if __name__ == '__main__':
    pytest.main(['test11_login_xfail.py','-sv','--runxfail'])

 运行以上命令,那么这条用例就会像断言失败的用例输出 。

8.@pytest.mark.run

  • 功能 :控制用例的运行顺序 ,但它需要下载插件pytest-ordering .

  • 格式 :@pytest.mark.run(order=n) ,其中n代表一个数字 ,数字越小,代表执行顺序越靠前 ,反之数字越大,越靠后。

  • 需求 :给登录的测试用例标记不同的顺序 ,具体如下:

 运行结果如下 :

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1379531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

当一堆数据差异过大如何选?

我们通过采样获得一对数组&#xff0c;但是他们差异过大&#xff0c;所以我们选择进行一次滤除。 先看基本概念&#xff1a; 移动平均&#xff08;Moving Average&#xff09;&#xff1a; 计算每个数据点及其相邻数据点的平均值&#xff0c;可以使用不同的窗口大小。这有助于…

获取 Dll 模块的加载字符串资源

概要 获取 Dll 模块中加载的字符串资源&#xff0c;可以通过 LoadString 实现。这个函数可以用于在不同版本索引系统字符串&#xff0c;对于一些根据名称操作系统菜单的功能&#xff0c;可以使用这种方法动态获取系统模块当前的加载字符串。 LoadStringW 从与指定模块关联的可…

Linux中断 -- 中断应答、嵌套、

接上文&#xff0c;本文继续介绍Linux软件部分逻辑。 参考内核版本&#xff1a;kernel-4.19 目录 1.中断信号在各级中断控制器中的应答 2.supports_deactivate_key意义 3.中断嵌套 1.中断信号在各级中断控制器中的应答 本章主要从内核软件层面来看各中断控制器对中断信号处…

反敏捷宣言

很多时候&#xff0c;敏捷在实践中并没有帮助团队更好的完成工作&#xff0c;而是成为了某种障碍以及僵化的流程。原文: The Anti-Agile Manifesto 警告1: 如果你是敏捷教练或Scrum Master或任何其他形式的敏捷支持者&#xff0c;本文的很多内容都会让你不爽。本文的目的之一是…

Spring MVC组件

1.DispatcherServlet前端控制器 用户请求到达前端控制器&#xff0c;它就相当于mvc模式中的c&#xff0c;dispatcherServlet 是整个流程控制的中心&#xff0c;由它调用其它组件处理用户的请求&#xff0c;dispatcherServlet 的存在降低了组件之间的耦合性。 2.HandlerMappin…

poi解析word取参数方法${参数名}获取参数异常处理(2024-01-12)

poi 读取word模板&#xff0c;确保 ${参数名} 在一个XWPFRun XWPFDocument读取word模板&#xff0c;经常遇到 ${参数名} 没有被识别在一个XWPFRun中&#xff0c;导致参数解析异常如法实现参数替换。 这里只是介绍word模板参数解析问题&#xff0c;让word格式如何转换为可以正常…

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK实现相机的高速图像保存&#xff08;C#&#xff09;&#xff09; Baumer工业相机Baumer工业相机的图像高速保存的技术背景Baumer工业相机通过NEOAPI SDK函数图像高速保存在NEOAPI SDK里实现线程高速图像保存&#xff1a;工业相机高…

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出…

性能测试分析案例-使用动态追踪定位性能瓶颈

所谓动态追踪&#xff0c;就是在系统或者应用程序正常运行的时候&#xff0c;通过内核中提供的探针&#xff0c;来动态追踪它们的行为&#xff0c;从而辅助排查出性能问题的瓶颈。 使用动态追踪&#xff0c;可以在不修改代码、不重启服务的情况下&#xff0c;动态了解应用程序或…

《 乱弹篇(二)》

题记 昨&#xff08;2024年1月12日&#xff09;天&#xff0c;既然笔者因感到写时评文力不从心&#xff0c;新辟一专栏《乱弹篇》&#xff0c;开始了“ 东西南北&#xff0c;古今中外&#xff0c;谈而不乱&#xff0c;抒怀而已”的写作路径&#xff0c;就要走下去&#xff0c;…

debian12部署Gitea服务

首先安装git、wget、sqlite&#xff0c;然后进行用户和组的相关设置 sudo apt install -y git wget sqlite3 新增一个git用户与一个git组 sudo adduser --system --group --disabled-password --shell /bin/bash --home /home/git --gecos Git Version Control git 给git用户设…

必看!2023年机器人领域十大事件!

原创 | 文 BFT机器人 2023年&#xff0c;机器人产业快速发展&#xff0c;成就了机器人领域的一个又一个里程碑。机器人行业涌现了许多令人瞩目的事件&#xff0c;实现了重大突破&#xff0c;展示了机器人技术在各个领域的广泛应用和革命性变革。 本文将对2023年机器人领域的十…

数字化时代,VR全景展示如何让用户一窥全貌?

数字化时代&#xff0c;VR全景展示为各行各业提供了无限的可能性。随着VR全景技术的逐步普及&#xff0c;VR全景展示以其独特的呈现方式和新颖十足的交互体验&#xff0c;正在不断改变着人们对于展示宣传的理解。 传统的展示方式&#xff0c;通常需要将产品、图文、品牌等元素集…

131基于matlab的差分进化算法优化K均值聚类问题

基于matlab的差分进化算法优化K均值聚类问题&#xff0c;可调整K参数得到最佳聚类结果。输出聚类可视化图和优化迭代曲线。可替换自己的数据&#xff0c;程序已调通&#xff0c;可直接运行。 131matlab差分进化算法K均值聚类 (xiaohongshu.com)

一份保姆级的 Stable Diffusion 部署教程,开启你的炼丹之路

市面上有很多可以被用于AI绘画的应用&#xff0c;例如DALL-E、Midjourney、NovelAI等&#xff0c;他们的大部分都依托云端服务器运行&#xff0c;一部分还需要支付会员费用来购买更多出图的额度。 在2022年8月&#xff0c;一款叫做Stable Diffusion的应用&#xff0c;通过算法…

GPT-4V的图片识别和分析能力原创

GPT-4V是OpenAI开发的大型语言模型&#xff0c;是GPT-4的升级版本。GPT-4V在以下几个方面进行了改进&#xff1a; 模型规模更大&#xff1a;GPT-4V的参数量达到了1.37T&#xff0c;是GPT-4的10倍。 训练数据更丰富&#xff1a;GPT-4V的训练数据包括了1.56T的文本和代码数据。 …

伴鱼实时数仓建设案例

伴鱼实时数仓建设案例 文章目录 伴鱼实时数仓建设案例伴鱼实时作业应用场景伴鱼实时数仓的建设体系DWD 层复杂场景数据处理方案1. 数据的去重2. join场景两条实时数据流相关联对于关联历史数据 3. 从数据形态观查join DWS 数据层数据处理方案未来与展望 随着伴鱼业务的快速发展…

openAI API key不需要中转,自己就可以使用正版

很多小伙伴因为不知道怎么使用原版&#xff0c;用的都是国内套壳的&#xff0c;国内套壳的有些价格不合适&#xff0c;如何是3.5的话只需要绑定虚拟信用卡就可以使用 想使用openai API key4.0的话你需要先开通ChatGPTplus&#xff0c;在绑定openai API key&#xff0c;绑定ope…

磁盘直通卡/阵列卡讲解

服务器SAS卡 ① 华为SR120 (LSI 2308 6Gb SAS直通卡),适合数据安全等级不高或 更换简单 硬盘即插即用 ② 华为SR320 (LSI 2208 6Gb SAS阵列卡 带512M缓存),适合对数据安全等级要求高或追求磁盘性能的客户 推荐上阵列卡 ③ 华为SR130 (LSI 3008 12Gb SAS直通卡),适合数据安全等…

APM链路监控: Linux 部署 pinpoint

目录 一、实验 1.环境 2. 准备 3.HBase单机部署 4.pinpoint部署 二、问题 1.pinpoint有哪些功能 2.pinpoint架构是如何组成的 3.Linux中自带的jdk 如何设置JAVA_HOME 4. hbase启动报错 5.hbase的master启动失败 6.JPS命令如何安装和使用 一、实验 1.环境 &#x…