琐碎笔记——pytest实现前置、后置、参数化、跳过用例执行以及重试

pytest的fixture中文介绍可参考(不过文档稍微有点老):
https://www.osgeo.cn/pytest/fixture.html#what-fixtures-are

pytest各个作用域的fixture

  • scope = “function”
    可作用于每个用例
    fixture使用的声明放在类定义前面,类中的每个用例执行时都会调用fixture装饰函数
    fixture使用的声明放在用例前,用例执行时会调用fixture装饰函数
  • scope = “class”
    作用于整个类
    fixture使用的声明放在类定义前面,类中的第一个用例执行时会调用fixture装饰函数一次
    fixture使用的声明放在类中的用例前,用例执行时会调用fixture装饰函数一次,之后的用例即时有@pytest.mark.usefixtures(“fixture_class”),也不会执行
  • scope = “module”
    作用于整个python文件
    在整个python文件中只会调用一次,
    不管@pytest.mark.usefixtures(“fixture_module”)声明放在哪里(类外的用例前、类的声明前或这个类中的用例前),fixture函数都只会在整个python文件执行第一个用例时调用一次
  • scope = “session”
    作用于整个会话,通常可以放在conftest.py文件中,作为全局使用的前、后置步骤
    在所有地方都可以使用@pytest.mark.usefixtures(“fixture_session”)

例:

import pytest@pytest.fixture(scope="function")
def fixture_function():print("fixture_function ####")@pytest.fixture(scope="class")
def fixture_class():print("fixture_class ----")@pytest.fixture(scope="module")
def fixture_module():
print("fixture_module @@@@")def test_0():print('test_0')@pytest.mark.usefixtures("fixture_class")
@pytest.mark.usefixtures("fixture_function")
class Test_class():@pytest.mark.usefixtures("fixture_module")def test_1(self):print('test_1')def test_2(self):print('test_2')def test_3(self):print('test_3')def test_4(self):print('test_4')

打印内容如下:

============================== 4 passed in 0.23s ==============================
fixture_module @@@@
fixture_class ----
fixture_function ####
PASSED                                   [ 25%]test_1
fixture_function ####
PASSED                                   [ 50%]test_2
fixture_function ####
PASSED                                   [ 75%]test_3
fixture_function ####
PASSED                                   [100%]test_4Process finished with exit code 0

1.2.pytest添加fixture装饰实现前置、后置方法

可以通过fixture夹具实现前置后置方法,后置需要使用yeild来实现。
如果一个方法或者一个类想要同时调用多个fixture。有两种方法:

  1. 可以使用@pytest.mark.usefixtures()进行叠加。
    注意叠加顺序,先执行的后添加@pytest.mark.usefixtures语句,后执行的先添加。
    需注意:与直接传入fixture不同的是,@pytest.mark.usefixtures无法获取到被fixture装饰的函数的返回值;
    @pytest.mark.usefixtures的使用场景是:被测试函数需要多个fixture做前后置工作时使用;
  2. 可以在方法中添加多个fixture函数名作为入参,执行顺序:先入参的后调用。

具体如下:

import pytestclass Test_hhh:@pytest.fixturedef setup_step1(self):print("setup_step1 @@@@")@pytest.fixturedef setup_and_teardown_step2(self):print("setup_step2 ####")yieldprint('teardown_setp2 ####\n')@pytest.mark.usefixtures("setup_step1")def test_1(self):print('test_1')@pytest.mark.usefixtures("setup_step1")@pytest.mark.usefixtures("setup_and_teardown_step2")def test_2(self):print('test_2')def test_3(self, setup_step1, setup_and_teardown_step2):print('test_3')def test_4(self, setup_and_teardown_step2):print('test_4')

setup_step1()、setup_and_teardown_step2()两个函数前添加了 @pytest.fixture 装饰,scope默认是"function"。
每次执行test_1用例之前,都会先调用setup_step1()。
每次执行test_2用例之前,都会先调用setup_and_teardown_step2(),再调用setup_step1()。
每次调用test_3用例之前,都会先调用setup_and_teardown_step2(),再调用setup_step1()。
每次调用test_4用例之前,都会先调用setup_and_teardown_step2()。
打印顺序如下:

============================== 4 passed in 0.21s ==============================
setup_step1 @@@@
PASSED                                     [ 25%]test_1
setup_step2 ####
setup_step1 @@@@
PASSED                                     [ 50%]test_2
teardown_setp2 ####setup_step1 @@@@
setup_step2 ####
PASSED                                     [ 75%]test_3
teardown_setp2 ####setup_step2 ####
PASSED                                     [100%]test_4
teardown_setp2 ####Process finished with exit code 0

pytest中各个级别的setup和teardown方法

除了使用fixture来实现前置、后置。pytest也可以直接使用setup和teardown方案实现前置、后置。pytest的前置、后置分为方法级、类级和模块级。

  • 方法级:setup_method() teardown_method()
  • 类级别:setup_class() teardown_class()
  • 模块级:setup_module() teardown_method()
def setup_module():print("setup_module")def teardown_module():print("teardown_module")def test_1():print("test_1")assert 1 == 1class Test_learn:def setup_method(self):print("setup_method")def teardown_method(self):print("teardown_method")def setup_class(self):print("setup_class")def teardown_class(self):print("teardown_class")def test_2(self):print("test_2")assert Truedef test_3(self):print("test_3")

在整个文件中的第一个用例执行前,setup_module()会被调用。
在整个文件中的最后一个用例执行后,teardown_module()会被调用。
在类中的第一个用例执行前,setup_calss()会被调用。
在类中的最后一个用例执行后,teardown_class()会被调用。
在类中的每个用例执行前,setup_method()会被调用。
在类中的每个用例执行后,teardown_method()会被调用。
打印结果如下:

============================= test session starts =============================
collecting ... collected 3 itemstest_file.py::test_1 
setup_module
test_1
PASSED
test_file.py::Test_learn::test_2 
setup_classsetup_method
test_2
PASSEDteardown_methodtest_file.py::Test_learn::test_3 
setup_method
test_3
PASSEDteardown_method
teardown_class
teardown_module============================== 3 passed in 0.04s ==============================

pytest参数化

可以使用@pytest.mark.parametrize进行参数化,具体用法如下:

import pytestclass Test_learn:test_data = [['正常登录', 'user1', 'password1', '登录成功'],['密码错误', 'user2', 'password2', '用户名或密码错误,请重新输入']]ids = [i[0] for i in test_data]@pytest.mark.parametrize("case, username, password, expect_text", test_data, ids=ids)def test_1(self, case, username, password, expect_text):print('\n',case,username, password, expect_text)assert  Truedata2 = [{"username": "张三", "password":"123456"},{"username": "李四", "password": "123456"}]@pytest.mark.parametrize("dic",data2)def test_2(self, dic):print('\n',dic['username'], dic['password'])assert True

@pytest.mark.parametrize()中,第一个参数参数名(可以是一个或多个),第二个参数test_data为具体数据,第三个参数ids为用例名,参数名和数组中元素按顺序对应取值。
如上第一个用例中,数据有两条。第一条参数:case=‘登录成功’,username=‘user1’, password=‘password1’, expect_text=‘登录成功’;第一条用例的名称:'登录成功’。
参数的数据也可以是字典、元组等。
执行打印如下:

============================= test session starts =============================
collecting ... collected 4 itemstest_file.py::Test_learn::test_1[\u6b63\u5e38\u767b\u5f55] 正常登录 user1 password1 登录成功
PASSED
test_file.py::Test_learn::test_1[\u5bc6\u7801\u9519\u8bef] 密码错误 user2 password2 用户名或密码错误,请重新输入
PASSED
test_file.py::Test_learn::test_2[dic0] 张三 123456
PASSED
test_file.py::Test_learn::test_2[dic1] 李四 123456
PASSED============================== 4 passed in 0.04s ==============================

pytest跳过用例

  • 无条件跳过用例
    @pytest.mark.skip
  • 条件成立时,跳过用例
    @pytest.mark.skipif(表达式, reason=‘跳过用例的原因’)
    如:
import pytest# 会被跳过的
@pytest.mark.skipif(4%2 == 0,  reason='跳过用例的原因')
def test_skip_if_true():var = 'world'assert var == 'world'# 不会被跳过的
@pytest.mark.skipif(5%2 == 0,  reason='跳过用例的原因')
def test_skip_if_false():var = 2assert var == 2@pytest.mark.skip
def test_skip():var = 'HELLO'assert var == 'HELLO'

打印结果:

============================= test session starts =============================
collecting ... collected 3 itemstest_file.py::test_skip_if_true SKIPPED (跳过用例的原因)
Skipped: 跳过用例的原因test_file.py::test_skip_if_false PASSED
test_file.py::test_skip SKIPPED (unconditional skip)
Skipped: unconditional skip======================== 1 passed, 2 skipped in 0.03s =========================

pytest指定用例的执行顺序

需要安装插件:

pip install pytest-ordering

通过如下装饰器来指定执行顺序,order为整型,值越小,越先执行。

@pytest.mark.run(order=n)

n>=0的情况,有装饰器的用例比没有顺序装饰器的用例先执行;
n<0的情况,有装饰器的用例比没有顺序装饰器的用例后执行
例子:

import pytest@pytest.mark.run(order=1)
def test_1():var = 'world'assert var == 'world'@pytest.mark.run(order=0)
def test_2():var = 2assert var == 2@pytest.mark.run(order=-1)
def test_3():var = 'HELLO'assert var == 'HELLO'def test_4():assert True

执行结果:

============================= test session starts =============================
collecting ... collected 4 itemstest_file.py::test_2 PASSED
test_file.py::test_1 PASSED
test_file.py::test_4 PASSED
test_file.py::test_3 PASSED============================== 4 passed in 0.02s ==============================

pytest用例执行重试

需要安装第三方插件:

pip install pytest-rerunfailures

使用方式有两种:

  • 直接在命令行指定 reruns表示最大重试次数,reruns-delay表示每次重试前的等待时间

     pytest -s -q --reruns=2 --reruns-delay=5 {cases_path} --alluredir  {report_path}
    
  • 使用@pytest.mark.flaky装饰器,reruns表示最大重试次数,reruns_delay表示每次重试前的等待时间,如: @pytest.mark.flaky(reruns=3, reruns_delay=2)
    例:

import pytest@pytest.mark.run(order=-1)
def test_1():var = 'world'assert var == 'world'@pytest.mark.flaky(reruns=3, reruns_delay=2)
def test_4():assert False

执行结果如下,test_4执行了四次,因为执行失败进行重试而执行的有三次。

============================= test session starts =============================
collecting ... collected 2 itemstest_file.py::test_4 RERUN
test_file.py::test_4 RERUN
test_file.py::test_4 RERUN
test_file.py::test_4 FAILED
test_file.py:7 (test_4)
@pytest.mark.flaky(reruns=3, reruns_delay=2)def test_4():
>       assert False
E       assert Falsetest_file.py:10: AssertionErrortest_file.py::test_1 PASSED==================== 1 failed, 1 passed, 3 rerun in 6.15s =====================进程已结束,退出代码为 1

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

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

相关文章

加速 AI 创新:引入 Elastic AI 生态系统

作者&#xff1a;来自 Elastic Alyssa Fitzpatrick, Steve Kearns 生成式人工智能 (Generative AI - GenAI) 正在改变我们所熟知的商业格局。为了简化和加速开发人员构建和部署检索增强生成 (retrieval augmented generation - RAG) 应用程序的方式&#xff0c;Elastic 自豪地宣…

SpringSecurity 鉴权认证入门讲解

​ Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro&#xff0c;它提供了更丰富的功能&#xff0c;社区资源也比Shiro丰富。 ​ 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多&#xff0c;因为相比与Sp…

# ubuntu 安装的pycharm不能输入中文的解决方法

ubuntu 安装的pycharm不能输入中文的解决方法 一、问题描述&#xff1a; 当在 ubuntu 系统中&#xff0c;安装了 pycharm&#xff08;如&#xff1a;pycharm2016, 或 pycharm2018&#xff09;,打开 pycharm 输入代码时&#xff0c;发现不能正常输入中文&#xff0c;安装的搜狗…

小白进!QMK 键盘新手入门指南

经常玩键盘的伙伴应该都知道&#xff0c;现在的键盘市场可谓是百花齐放&#xff0c;已经不是之前的单一功能产品化时代。我们可以看到很多诸如&#xff1a;机械轴键盘、磁轴键盘、光轴键盘、电感轴键盘&#xff0c;以及可能会上市的光磁轴键盘&#xff0c;更有支持屏幕的、带旋…

EXCEL 或 WPS 列下划线转驼峰

使用场景&#xff1a; 需要将下划线转驼峰&#xff0c;直接在excel或wps中第一行使用公式&#xff0c;然后快速刷整个列格式即可。全列工下划线转为格式&#xff0c;使用效果如下&#xff1a; 操作步骤&#xff1a; 第一步&#xff1a;在需要显示驼峰的一列&#xff0c;复制以…

微信小程序:vant组件库安装步骤

前言&#xff1a;在微信小程序中引用vant组件报错&#xff0c;提示路径不存在&#xff0c;这很有可能是因为没有安装构建vant组件库导致。下面是我整理的安装vant组件库的步骤: 第一步&#xff1a;安装node.js(执行完第一步请重启小程序) 具体步骤请看链接&#xff1a;node.js…

vue3【实战】切换全屏【组件封装】FullScreen.vue

效果预览 原理解析 使用 vueUse 里的 useFullscreen() 实现 代码实现 技术方案 vue3 vite UnoCSS vueUse 组件封装 src/components/FullScreen.vue <template><component:is"tag"click"toggle":class"[!isFullscreen ? i-ep:full-sc…

GPIO相关的寄存器(重要)

目录 一、GPIO相关寄存器概述 二、整体介绍 三、详细介绍 1、端口配置低寄存器&#xff08;GPIOx_CRL&#xff09;&#xff08;xA...E&#xff09; 2、端口配置高寄存器&#xff08;GPIOx_CRH&#xff09;&#xff08;xA...E&#xff09; 3、端口输入数据寄存器&#xff…

【Hadoop实训】Hive 数据操作②

延续上一篇文章&#xff0c;不懂的宝子们请看以下链接&#xff1a; 【Hadoop实训】Hive 数据操作①-CSDN博客 目录 一、Group by 语句 (1)、计算emp表每个部门的平均工资 (2)、计算emp表每个部门中每个岗位的最高工资 二、Having 语句 (1)、求每个部门的平均工资 (2)、求每个…

Vulhub漏洞复现---solr---CVE-2019-17558

漏洞描述 Apache Solr 5.0.0到Apache Solr 8.3.1容易受到通过VelocityResponseWriter执行的远程代码的攻击。Velocity模板可以通过configset ’ Velocity / 目录中的Velocity模板或作为参数提供。用户定义的configset可以包含可呈现的、潜在的恶意模板。参数提供的模板在默认情…

ADS学习笔记 5. 微带天线设计

基于ADS2023 update2 参考书籍&#xff1a;卢益锋老师《ADS射频电路设计与仿真学习笔记》 更多笔记&#xff1a;ADS学习笔记 1. 功率放大器设计ADS学习笔记 2. 低噪声放大器设计ADS学习笔记 3. 功分器设计ADS学习笔记 4. 微带分支定向耦合器设计 目录 0、设计指标 1、微带…

【JAVA】使用IDEA创建maven聚合项目

【JAVA】使用IDEA创建maven聚合项目 1.效果图 2.创建父模块项目 2.1删除父模块下面的src目录以及不需要的maven依赖 3创建子模块项目 3.1右击父模块项目选择Module… 3.2创建子模块 3.3删除子模块下不需要的maven依赖 4.子模块创建完成后引入SpringBoot依赖启动项目

一文详细深入总结服务器选型

1. 题记&#xff1a; 服务器选型工作是项目规划检讨的一项非常重要的工作&#xff0c;本文详细深入总结服务器选型。 2. 服务器基础知识概览 2.1 服务器的定义与功能 2.1 .1 定义 服务器是一种高性能计算机&#xff0c;其设计目的是在网络中提供服务。它可以处理来自多个客…

如何编译 Cesium 源码

如何编译 Cesium 源码 Cesium 是一个开源的 JavaScript 库&#xff0c;用于构建 3D 地球和地图应用程序。它提供了一套强大的 API 和工具&#xff0c;使开发者能够创建丰富的地理空间应用。本文将指导您如何从 GitHub 下载 Cesium 源码&#xff0c;并在本地进行编译。 TilesB…

车载诊断架构 --- 关于DTC的开始检测条件

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

AI大模型(一):Prompt AI编程

一、Prompt Engineering&#xff0c;提示工程 提示工程也叫指令工程&#xff1a; Prompt是发给大模型的指令&#xff0c;比如【讲个睡前故事】、【用Python写个消消乐游戏】等&#xff1b;本质上大模型相关的工程工作&#xff0c;都是围绕prompt展开的&#xff1b;提示工程门…

如何在 Ubuntu 上安装 Jellyfin 媒体服务器

Jellyfin 是一个开源的媒体服务器软件&#xff0c;让你可以整理、管理和流式传输你的个人媒体收藏&#xff0c;比如电影、音乐、电视节目和照片&#xff0c;而且完全免费&#xff0c;没有订阅费用或数据收集的担忧。 简介 媒体管理&#xff1a;Jellyfin 整理媒体库&#xff0…

数据结构(初阶4)---循环队列详解

循环队列 1.循环队列的结构  1).逻辑模式 2.实现接口  1).初始化  2).判断空和满  3).增加  4).删除  5).找头  6).找尾 3.循环队列的特点 1.循环队列的结构 1).逻辑模式 与队列是大同小异的&#xff0c; 其中还是有一个指向队列头的head指针&#xff0c; 也有一个指向尾…

Qwen2.5-Coder-32B-Instruct Docker 部署openai接口

Qwen2.5-Coder-32B-Instruct 模型下载,国内快捷方式: conda create -n modelscope python=3.10 conda activate modelscopepip install modelscopemodelscope download --model Qwen/Qwen2.5-Coder-32B-Instruct --local_dir /ssd/xiedong/Qwen/Qwen2.5-Coder-32B-I

图形几何之美系列:二维凸包艺术赏析

“凸包是计算几何中的概念&#xff0c;凸包在多个领域中有广泛的应用&#xff0c;主要包括几何计算、图形处理、优化问题、路径规划等。” 1.前言 凸包话题包括二维凸包、三维凸包以及高维凸包。对于平面点集&#xff0c;探究如何构造可以覆盖给定点集最小的凸多边形&#xff1…