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

自动化测试框架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代表一个数字 ,数字越小,代表执行顺序越靠前 ,反之数字越大,越靠后。

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

 运行结果如下 :

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Agisoft Metashape 基于影像的外部点云着色

Agisoft Metashape 基于影像的外部点云着色 文章目录 Agisoft Metashape 基于影像的外部点云着色前言一、添加照片二、对齐照片三、导入外部点云四、为点云着色五、导出彩色点云前言 本教程介绍了在Agisoft Metashape Professional中,将照片中的真实颜色应用于从不同源获取的…

监督学习 - 逻辑回归(Logistic Regression)

什么是机器学习 逻辑回归&#xff08;Logistic Regression&#xff09;虽然名字中包含"回归"一词&#xff0c;但实际上是一种用于解决分类问题的统计学习方法&#xff0c;而不是回归问题。它是一种线性模型&#xff0c;常用于二分类问题&#xff0c;也可以扩展到多分…

【EI会议征稿通知】2024年图像处理与人工智能国际学术会议(ICIPAI2024)

2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09; 2024 International Conference on Image Processing and Artificial Intelligence&#xff08;ICIPAI2024&#xff09; 2024年图像处理与人工智能国际学术会议&#xff08;ICIPAI2024&#xff09;将…

python 爬虫 生成markdown文档

本文介绍的案例为使用python爬取网页内容并生成markdown文档&#xff0c;首先需要确定你所需要爬取的框架结构&#xff0c;根据网页写出对应的爬取代码 1.分析总网页的结构 我选用的是redis.net.com/order/xxx.html (如:Redis Setnx 命令_只有在 key 不存在时设置 key 的值。…

文件重命名:文件命名错了怎么办,新旧文件名互换的方法

在日常生活和工作中&#xff0c;经常要处理各种文件&#xff0c;会因为疏忽或者误解&#xff0c;给文件起错名字。文件名一旦错误&#xff0c;就可能造成后续的困扰&#xff0c;比如找不到需求的文件、混淆不同的文件等。如果文件命名错了如何更正呢&#xff1f;下面来看云炫文…

【Electron】 Vite项目 初始配置 scss

pnpm add -D sasssrc下面创建 styles/main.scss 文件 mian.ts 内引入 ./styles.scss 文件 import ./styles/main.scss 测试scss是否生效&#xff1a; styles/mian.scss :root{--mian:red; } App.vue <template><div>你好</div> </template><s…

上架苹果APP的时候在哪里填写APP的隐私政策信息

在如今高度重视数据隐私的时代&#xff0c;开发并上架一个iOS APP时提供透明的隐私政策是非常重要的。苹果公司对此有严格的规定&#xff0c;任何上架至App Store的应用都必须包含一个隐私政策。以下是您在上架苹果APP时填写隐私政策信息的详细步骤和必须注意的事项。 准备隐私…

阿里巴巴国际站商品采集API商品列表API商品详情数据API

阿里巴巴国际站&#xff08;Alibaba.com&#xff09;是阿里巴巴集团旗下的一个全球贸易平台&#xff0c;旨在连接全球买家和供应商&#xff0c;并促进国际贸易。它是目前世界上最大的B2B&#xff08;企业对企业&#xff09;在线交易市场之一。 阿里巴巴国际站提供了广泛的产品类…

使用知行之桥EDI系统的HTTP签名身份验证

本文简要概述了如何在知行之桥EDI系统中使用 HTTP 签名身份验证&#xff0c;并将使用 CyberSource 作为该集成的示例。 API 概述 API 是”应用编程接口”的缩写。这听起来可能很复杂&#xff0c;但它的真正含义是一种允许两个不同实体相互通信的软件。自开发以来&#xff0c;…

采集小红书笔记详情页的方法,大部分人都想得复杂了

一般来说&#xff0c;社交媒体都有列表页和详情页、个人主页三大页面&#xff0c;列表页一般包含搜索结果页、话题聚合页等等&#xff0c;详情页就是点开某一条笔记或者动态的具体页面&#xff1b; 小红书当然也不例外&#xff0c;比如下面这个话题聚合页&#xff1a; https:/…

高工微报告|智驾前视一体机趋势

传统智驾前视一体机赛道上&#xff0c;1V3R、1V5R产品如何升级备受关注。 根据日前调研获取的信息&#xff0c;1V3R、1V5R向轻量级行泊一体&#xff08;典型为5V5R12U方案&#xff0c;算力平台5-20TOPS&#xff09;迈进的具体市场空间&#xff0c;仍在验证阶段。 其中&#x…

java基于ssm框架的少儿编程在线培训系统论文

目 录 目 录 I 1 课题背景及研究内容 4 1.1 课题背景 4 1.2 开发目的和意义 4 2 相关技术和应用 4 2.1 VUE技术 4 2.2 Mysql数据库简介 5 2.3 SSM框架简介 6 2.4 Eclipse简介 6 2.5 B/S系统架构 6 3 系统分析 8 3.1可行性分析 8 3.1.1技术可行性 8 3.1.2经济可行性 8 3.1.3操作…

经验分享:智能知识库才是数字时代的企业必备选择

随着全球化和竞争的加剧&#xff0c;企业必须通过将知识作为战略资产进行管理&#xff0c;才能保持竞争优势。因此&#xff0c;建设有效的知识库系统&#xff0c;成为了数字时代企业必备的选择。决定企业成功或失败的不再仅仅是产品或服务的质量&#xff0c;而是如何有效利用知…

Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集

概况&#xff1a;Redis中的排序集数据结构是相当复杂的独特而有用的东西。它不仅提供了顺序排序数据的能力&#xff0c;而且具有按排名查询有序数据的独特特性。 Redis中的排序集 &#xff08;Sorted Set&#xff09;是一种特殊的数据结构&#xff0c;它结合了集合&#xff0…

mp4文件全部转换为mp3

问题 今天突发奇想&#xff0c;想把mp4视频转换为mp3来收听&#xff0c;于是想到了ffmpeg工具 步骤 安装ffmpeg环境 要在 Windows 上配置 FFmpeg 环境&#xff0c;你可以按照以下步骤进行操作&#xff1a; 下载 FFmpeg&#xff1a; 首先&#xff0c;你需要下载 FFmpeg 的 W…

【MYSQL】MYSQL 的学习教程(十二)之 MySQL 啥时候用记录锁,啥时候用间隙锁

在「读未提交」和「读已提交」隔离级别下&#xff0c;都只会使用记录锁&#xff1b;而对于「可重复读」隔离级别来说&#xff0c;会使用记录锁、间隙锁和 Next-Key 锁 那么 MySQL 啥时候会用记录锁&#xff0c;啥时候会用间隙锁&#xff0c;啥时候又会用 Next-Key 锁呢&#xf…

Apache OFBiz groovy 远程代码执行漏洞(CVE-2023-51467)复现

Apache OFBiz groovy 远程代码执行漏洞&#xff0c;攻击者可构造请求绕过身份认证&#xff0c;利用后台相关接口功能执行groovy代码&#xff0c;导致远程代码执行。 1.漏洞级别 高危 2.漏洞搜索 fofa app"Apache_OFBiz"3.影响范围 Apache OFBiz < 18.12.104…

网站开发第一弹---HTML01

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;网站开发flask框架 &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现…

【Spring Cloud】微服务架构演变及微服务架构介绍

文章目录 系统架构演变单体应用架构垂直应用架构分布式架构SOA 架构微服务架构 微服务架构介绍微服务架构的常见问题微服务架构的常见概念服务治理服务调用服务网关服务容错链路追踪 微服务架构的常见解决方案ServiceCombSpringCloudSpring Cloud Alibaba 总结 欢迎来到阿Q社区…

让企业的招投标文件、生产工艺、流程配方、研发成果、公司计划、员工信息、客户信息等核心数据更安全。

PC端访问地址1&#xff1a;www.drhchina.com PC端访问地址2&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 全方位立体式防护  让数据泄密无处遁形 信息防泄漏是一项系统的整体部署工程&#xff0c;加密监控已成为多数企事业单…