自动化测试框架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 = 0actual_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 = 3actual_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 = 2actual_result = login('admin', '').get('code')assert expect_reesult == actual_resultif __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 logincases = [(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 = 0actual_result = login('admin','123456').get('code')assert expect_result == actual_result# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.p2
def test_password_is_wrong():print("2")expect_reesult = 3actual_result = login('admin','1234567').get('code')assert expect_reesult == actual_result# case3 : 输入用户名和空的密码进行登录
@pytest.mark.p2
def test_password_is_null():print("3")expect_reesult = 2actual_result = login('admin', '').get('code')assert expect_reesult == actual_resultif __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 = 0actual_result = login('admin','123456').get('code')assert expect_result == actual_result# case2 : 输入正确的用户名和错误的密码进行登录
@pytest.mark.p2
def test_password_is_wrong():print("2")expect_reesult = 3actual_result = login('admin','1234567').get('code')assert expect_reesult == actual_result# case3 : 输入用户名和空的密码进行登录
@pytest.mark.p2
def test_password_is_null():print("3")expect_reesult = 2actual_result = login('admin', '').get('code')assert expect_reesult == actual_resultif __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 = 0actual_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 = 3actual_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 = 2actual_result = login('admin', '').get('code')assert expect_reesult == actual_resultif __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 = 0actual_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 = 3actual_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 = 20actual_result = login('admin', '').get('code')assert expect_reesult == actual_resultif __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.mzph.cn/news/617627.shtml

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

相关文章

Vant4在Vue3.3中如何按需导入组件和样式

前言 最近我在Vue 3.3的项目中对Vant4做按需导入时&#xff0c;尽管按照Vant4的官方指南进行操作&#xff0c;但样式仍然无法正确加载。经过深入研究和多篇文章的比较&#xff0c;我终于找到了在Vue3中如何正确的按需导入Vant 4组件和样式的方法。由于Vue3.3和Vant4相对较新&am…

2024年前端面试中JavaScript的30个高频面试题之高级知识

基础知识 中级知识 21. 什么是执行上下文,执行堆栈,变量对象和作用域链? 执行上下文: 执行上下文是指代码执行的环境。它由作用域,变量对象和“this”关键字的值组成。 每当一个函数被执行时,就会创建一个执行上下文,并包含该函数的所有变量或属性。 JavaScript中有三种类型…

华为机试真题实战应用【赛题代码篇】-路灯照明(附Java、C++和python代码)

目录 问题描述 思路解析 思路1 思路2 代码实现 C++ 代码2

多无人机编队避障(人工势场法)

matlab2020正常运行&#xff0c;预设编队类型&#xff0c;目标位置&#xff0c;障碍物 多无人机编队避障&#xff08;人工势场法&#xff09;资源-CSDN文库

树莓派ubuntu:新增用户

切换到Root用户 sudo -i创建新用户 useradd -m 新用户名设置密码 passwd 新用户名将新用户加入sudo用户组 adduser newname sudo拷贝数据 cp -R /home/旧用户名/* /home/新用户名/查看用户所属组 id 新用户名更改文件所属 sudo chown 新用户名:group /home/新用户名/*gr…

浅析链表结构

一、单向链表 C语言中数组是常用的一种数据类型&#xff0c;但可惜数组长度是固定大小的&#xff0c;不能动态扩展&#xff0c;使用起来有时不是很方便。然后就有了自定义的动态数组结构&#xff0c;动态数组就比较好用了&#xff0c;长度可以任意扩展&#xff0c;但还有一个问…

easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏

1&#xff1a;效果示例 2&#xff1a;代码示例&#xff1a; UnLockCell.java package com.example.juc.zhujie;/*** Author * Date Created in 2023/12/19 10:09* DESCRIPTION:* Version V1.0*/import java.lang.annotation.*;/*** 用于标记锁定哪些列不需要锁定* author 12…

YOLOv8改进 | 检测头篇 | 利用DySnakeConv改进检测头专用于分割的检测头(全网独家首发,Seg)

一、本文改进 本文给大家带来的改进机制是一种我进行优化的专用于分割的检测头,在分割的过程中,最困难的无非就是边缘的检测,动态蛇形卷积(Dynamic Snake Convolution)通过自适应地聚焦于细长和迂回的局部结构,准确地捕捉管状结构的特征。这种卷积方法的核心思想是,通过…

【LangChain学习之旅】—(7) 调用模型:使用OpenAI API还是微调开源Llama2/ChatGLM?

【LangChain学习之旅】—&#xff08;7&#xff09; 调用模型&#xff1a;使用OpenAI API还是微调开源Llama2/ChatGLM&#xff1f; 大语言模型发展史预训练 微调的模式用 HuggingFace 跑开源模型申请使用 Meta 的 Llama2 模型通过 HuggingFace 调用 LlamaLangChain 和 Hugging…

若依在表格中如何将字典的键值转为中文

文章目录 一、需求&#xff1a;二、问题解决步骤1、给需要转换的列绑定formatter属性2、获取字典项3、编写formatter属性绑定的方法 一、需求&#xff1a; 后端有时候返回的是字典的键值&#xff0c;在前端展示时需要转成中文值 后端返回的是dictValue&#xff0c;现在要转换…

【Git】本地仓库文件的创建、修改和删除

目录 一、基本信息设置 1、设置用户名2、设置用户名邮箱 二、Git仓库操作介绍 1、创建一个新的文件夹2、在文件内初始化git仓库&#xff08;创建git仓库&#xff09;3、向仓库中添加文件 1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库 4、修改仓库文件 1.修改文件2.…

java中数组

文章目录 java中数组思维导图数组数组概念 数组定义格式详解数组的访问 常见异常数组索引值越界异常&#xff1a;ArrayIndexOutOfBoundsException空指针异常&#xff1a;NullPointerException 案例例一打印A-Z和0-9例二数组转置输出 java中数组 思维导图 数组 数组概念 组就…

Java8常用新特性

目录 简介 1.默认方法 2..Lambda表达式 3.Stream API 4.方法引用 5.Optional类 简介 Java 8是Java编程语言的一个重要版本&#xff0c;引入了许多令人兴奋和强大的新特性。这些特性使得Java程序更加现代化、灵活和高效。让我们一起来探索一些Java 8的常用新特性吧&#…

NestJS 如何自定义中间件以及实际项目基于中间件提升项目开发效率

前言 NestJS 作为一个强大的 Node.js 框架&#xff0c;允许你通过中间件对请求和响应进行处理。中间件的概念在其他许多框架中也存在&#xff0c;它们在请求处理流程的早期执行&#xff0c;因此非常适合执行如日志记录、请求验证、设置响应头等任务。 在这篇教程中&#xff0…

Mac 下载 nvm 后执行nvm -v 命令报错 nvm: command not found

1、问题&#xff1a;Mac 使用命令下载nvm 成功后执行 nvm -v 查看&#xff0c;报错&#xff1a;nvm command not found 2、原因&#xff1a;可能是系统更新后&#xff0c;默认的 shell 是 zsh&#xff0c;所以找不到配置文件 3、解决&#xff1a;可添加编辑.bash_profile 和 …

回归和拟合的关系

在统计学和机器学习中&#xff0c;回归&#xff08;Regression&#xff09;和拟合&#xff08;Fitting&#xff09;是密切相关的概念&#xff0c;它们通常一起使用来描述如何通过模型来逼近或拟合数据。 回归&#xff08;Regression&#xff09;&#xff1a; 回归是一种统计学…

Docker 安装部署

1、Docker 安装 ① 卸载docker&#xff0c;清空之前的docker文件 yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce…

2021腾讯、华为前端面试题集(基础篇)

Vue 面试题 生命周期函数面试题 1.什么是 vue 生命周期2.vue 生命周期的作用是什么 3.第一次页面加载会触发哪几个钩子 4.简述每个周期具体适合哪些场景 5.created 和 mounted 的区别 6.vue 获取数据在哪个周期函数 7.请详细说下你对 vue 生命周期的理解&#xff1f; **vue 路由…

达梦数据库主备集群

1&#xff1a;服务器硬件需求 按实际业务需求&#xff0c;选择合适的服务器&#xff0c;准备 3 台服务器&#xff0c;一台主库服务器&#xff0c;一台备库服务器&#xff0c;一台监视器服务器&#xff0c;服务器参数建议如下&#xff1a; 硬件要求物理内存>16 GB交换区Swa…

MySQL同步ES的几种方案

MySQL数据同步ES的几种方案 1. 同步双写 与业务耦合深&#xff0c;且业务响应时间长 2. 异步双写 这时可以使用类似MQ这样的中间件&#xff0c;业务主写时向MQ发送一条信息&#xff0c;再由一个聚合服务区消费&#xff0c;最终同步到ES 3. 定时任务 不好配置时间&#xff0c;…