pytest测试框架之fixture测试夹具详解

fixture的优势

​ pytest框架的fixture测试夹具就相当于unittest框架的setup、teardown,但相对之下它的功能更加强大和灵活。

  • 命名方式灵活,不限于unittest的setup、teardown
  • 可以实现数据共享,多个模块跨文件共享前置后置
  • 可以实现多个模块跨文件使用一个session来完成多个用例
  • 可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题

fixture定义及调用

​ 关键代码:@pytest.fixture(),用于声明函数是处理前置后置的测试夹具函数。用法如下:

python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#61aeee">@pytest.fixture()</span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">my_fixture</span>():</span>	<span style="color:#b18eb1"><em># 记住这个夹具名</em></span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"我的测试夹具"</span>)</span></span>

​ 测试夹具已经定义好了,那测试用例如何调用呢?有以下三种方式:

  • 方式一:将fixture名称作为参数传给测试用例,可以传多个fixture,按先后顺序执行
  • 方式二:装饰器:@pytest.mark.usefixtures(fixture_name)
    • 使用在类上,代表这个类所有测试用例都会调用这个fixture
    • 使用在用例上,代表只有这个用例调用这个fixture
    • 同样可以使用多个fixture,按先后顺序执行
    • 如果fixture有返回值,用这个装饰器是无法获取到返回值的,也就无法给用例传递数据,只能用方法一
  • 方式三:fixture设置autouse=True自动调用,同样fixture有返回值时,无法获取返回值
python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#f92672">import</span> pytest<span style="color:#61aeee">@pytest.fixture()</span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">my_fixture</span>():</span>	<span style="color:#b18eb1"><em># 记住这个夹具名</em></span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"我的测试夹具"</span>)<span style="color:#b18eb1"><em># 方式一</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_fix1</span>(<span style="color:#a6e22e">my_fixture</span>):</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"这是测试用例1111"</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"-------分割线------"</span>)<span style="color:#b18eb1"><em># 方式二</em></span>
<span style="color:#b18eb1"><em># 类中应用</em></span>
<span style="color:#61aeee">@pytest.mark.usefixtures(<span style="color:#3388aa">"my_fixture"</span>)</span>
<span style="color:#f92672">class</span> <span style="color:#e6c07b">TestLogin</span>:<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_fix2</span>(<span style="color:#a6e22e">self</span>):</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"这是测试用例2222"</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"-------分割线------"</span>)<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_fix3</span>(<span style="color:#a6e22e">self</span>):</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"这是测试用例3333"</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"-------分割线------"</span>)<span style="color:#b18eb1"><em># 测试用例应用</em></span>
<span style="color:#61aeee">@pytest.mark.usefixtures(<span style="color:#3388aa">"my_fixture"</span>)</span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_fix4</span>():</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"这是测试用例4444"</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"-------分割线------"</span>)<span style="color:#b18eb1"><em># 方式三</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_fix5</span>():</span>  <span style="color:#b18eb1"><em># 未声明使用测试夹具</em></span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"这是测试用例5555"</span>)<span style="color:#f92672">if</span> __name__ == <span style="color:#98c379">"__main__"</span>:pytest.main()</span></span>

​ 运行结果:

shell
<span style="background-color:#282c34"><span style="color:#abb2bf">Testing started at 23:12 ...
C:\software\python\python.exe ...test.py 我的测试夹具
.这是测试用例1111
-------分割线------
我的测试夹具
.这是测试用例2222
-------分割线------
我的测试夹具
.这是测试用例3333
-------分割线------
我的测试夹具
.这是测试用例4444
-------分割线------
.这是测试用例5555[100%]============================== 5 passed in 0.02s ==============================Process finished with exit code 0</span></span>

​ 为什么方式三没有用到测试夹具呢,因为还没有设置测试夹具自动调用。fixture里面有个参数autouse(自动使用的意思),默认是False,当设置为True时,用例就会自动调用该fixture功能,这样的话写用例时就不用每次都去传参了。

python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#61aeee">@pytest.fixture(autouse=<span style="color:#56b6c2">True</span>)	</span><span style="color:#b18eb1"><em># 设置用例自动调用该fixture</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">my_fixture</span>():</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"我的测试夹具"</span>)
</span></span>

fixture作用域

​ 在unittest中还有一个setUpClass和tearDownClass,是作用于类上,在每个测试用例类执行前去执行前置,用例类执行完再执行后置,pytest的fixture同样有这样的作用域,且使用更广泛更灵活。

​ 关键代码:@pytest.fixture(scope='作用范围'),参数如下:

  • function:默认作用域,每个测试用例都运行一次
  • class:每个测试类只执行一次
  •  module:每个模块只执行一次
  •  package:每个python包只执行一次
  •  session:整个会话只执行一次,即运行项目时整个过程只执行一次

​ 优先级session > package > module > class > function,优先级高的会在低的fixture之前先实例化。

​ 相同作用域的fixture遵循函数中声明的先后顺序,并遵循fixture之间的依赖关系,如在fixture_A里面依赖的fixture_B优先实例化,然后再到fixture_A实例化

​ 我们前面举例fixture的使用时都是使用的默认作用域,下面举例一下作用域为class的场景:

python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 因为用于演示,因此测试夹具直接写在py文件中</em></span>
<span style="color:#f92672">import</span> pytest
<span style="color:#f92672">from</span> selenium <span style="color:#f92672">import</span> webdriver<span style="color:#61aeee">@pytest.fixture(scope=<span style="color:#3388aa">'class'</span>)</span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">my_fixture</span>():</span><span style="color:#98c379">"""前置条件"""</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"前置条件-启动浏览器"</span>)driver = webdriver.Chrome()<span style="color:#f92672">yield</span> driverdriver.quit()<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"后置条件-关闭浏览器"</span>)<span style="color:#f92672">class</span> <span style="color:#e6c07b">TestCase</span>:<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_case01</span>(<span style="color:#a6e22e">self, my_fixture</span>):</span>    <span style="color:#b18eb1"><em># 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixture</em></span>driver = my_fixture    <span style="color:#b18eb1"><em># my_fixture不需要加括号</em></span>driver.get(<span style="color:#98c379">'http://www.baidu.com'</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">'第一个用例'</span>)<span style="color:#f92672">assert</span> <span style="color:#d19a66">1</span> == <span style="color:#d19a66">1</span><span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_case02</span>(<span style="color:#a6e22e">self, my_fixture</span>):</span>    <span style="color:#b18eb1"><em># 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixture</em></span>driver = my_fixture    <span style="color:#b18eb1"><em># my_fixture不需要加括号</em></span>driver.get(<span style="color:#98c379">'http://www.cnblogs.com/'</span>)<span style="color:#e6c07b">print</span>(<span style="color:#98c379">'第二个用例'</span>)<span style="color:#f92672">assert</span> <span style="color:#d19a66">1</span> == <span style="color:#d19a66">1</span><span style="color:#f92672">if</span> __name__ == <span style="color:#98c379">'__main__'</span>:pytest.main([<span style="color:#98c379">'test.py'</span>, <span style="color:#98c379">'-s'</span>])</span></span>

​ 运行结果如下,从运行结果可以看出,整个类只打开了一次浏览器。

shell
<span style="background-color:#282c34"><span style="color:#abb2bf">C:\software\python\python.exe D:/learn/test.py
============================= test session starts =============================
platform win32 -- Python 3.7.3, pytest-5.2.2, py-1.8.0, pluggy-0.13.0
rootdir: D:\learn
plugins: html-2.0.0, metadata-1.8.0
collected 2 itemstest.py 前置条件-启动浏览器
第一个用例
.第二个用例
.后置条件-关闭浏览器============================== 2 passed in 9.76s ==============================Process finished with exit code 0
</span></span>

​ 前面也提到了fixture的另外一个参数autouse,当autouse=True时,用例会自动执行测试夹具,但无法获取fixture的返回值,如上示例返回的driver就无法传递给用例了。

​ 如果你想让用例自动执行测试夹具且希望driver等参数可以返回给用例时,可以试一下在测试夹具中使用yield关键字返回值时把值存储到临时变量中,再让用例去取临时变量中的值,这里不作举例,以下是autouse=True的一个简单示例:(yield关键字在后面的章节会讲解)

python
<span style="background-color:#282c34"><span style="color:#abb2bf"><span style="color:#b18eb1"><em># 因为用于演示,因此测试夹具直接写在py文件中</em></span>
<span style="color:#f92672">import</span> pytest
<span style="color:#f92672">from</span> selenium <span style="color:#f92672">import</span> webdriver<span style="color:#61aeee">@pytest.fixture(scope=<span style="color:#3388aa">'class'</span>, autouse=<span style="color:#56b6c2">True</span>)	</span><span style="color:#b18eb1"><em># 所有类自动执行该测试夹具</em></span>
<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">my_fixture</span>():</span><span style="color:#98c379">"""前置条件"""</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">"前置条件-启动浏览器"</span>)driver = webdriver.Chrome()<span style="color:#f92672">yield</span> driverdriver.quit()<span style="color:#e6c07b">print</span>(<span style="color:#98c379">"后置条件-关闭浏览器"</span>)<span style="color:#f92672">class</span> <span style="color:#e6c07b">TestCase</span>:<span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_case01</span>(<span style="color:#a6e22e">self</span>):</span>	<span style="color:#b18eb1"><em># 不需要传入测试夹具</em></span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">'第一个用例'</span>)<span style="color:#f92672">assert</span> <span style="color:#d19a66">1</span> == <span style="color:#d19a66">1</span><span style="color:#61aeee"><span style="color:#f92672">def</span> <span style="color:#61aeee">test_case02</span>(<span style="color:#a6e22e">self</span>):</span><span style="color:#e6c07b">print</span>(<span style="color:#98c379">'第二个用例'</span>)<span style="color:#f92672">assert</span> <span style="color:#d19a66">1</span> == <span style="color:#d19a66">1</span><span style="color:#f92672">if</span> __name__ == <span style="color:#98c379">'__main__'</span>:pytest.main([<span style="color:#98c379">'test.py'</span>, <span style="color:#98c379">'-s'</span>])</span></span>

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

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

相关文章

【AutoLayout案例1-按钮居中显示 Objective-C语言】

一、按钮居中显示 1.接下来,我们就用这个autoLayout,自动布局,给大家写一个,实现几个案例,给大家看一下 那么,首先,第一个,大家注意, 当我们使用autoLayout,自动布局的时候,我们新建一个项目, 这个新建的项目,里面有一个控制器,这个控制器,是不是默认,是四四…

FreeRTOS通过消息队列实现串口命令解析(串口中断)

作者&#xff1a;Jack_G 时间&#xff1a;2023.08.08 版本&#xff1a;V1.0 上次修改时间&#xff1a; 环境&#xff1a; \quad \quad \quad \quad STM32Cube MX V6.8.1 \quad \quad \quad \quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 \quad \quad \quad \qu…

创意项目管理软件推荐:满足客户需求的完美解决方案

发现功能强大的工作管理软件&#xff0c;让创意大放异彩。将您团队的愿景变成引人注目的项目。 一、交付总是令人印象深刻的工作 Zoho Projects的创意项目管理软件可帮助您和您的团队在一个地方监督多个项目。使用我们的内置管理工具和模板&#xff0c;花更少的时间在管理上&a…

【福建事业单位-推理判断】02图形推理(数量-空间重构)

【福建事业单位-推理判断】02图形推理&#xff08;数量-空间重构&#xff09; 一、数量规律1.1点&#xff08;交点、切点&#xff09;点的细化考法总结 1.2线条&#xff08;线条的数量&#xff09;线的细化考点一笔画&#xff08;重点&#xff09;一笔画的判定 总结 1.3 面面的…

Ajax同源策略及跨域问题

Ajax同源策略及跨域问题 同源策略ajax跨域问题什么是跨域&#xff1f;为什么不允许跨域&#xff1f;跨域解决方案1、CORS2、express自带的中间件cors3、JSONP原生JSONPjQuery发送JSONP 4、使用vscode的Live Server插件 同源策略 同源策略&#xff08;Same-Origin Policy&#…

数学建模学习(9):模拟退火算法

模拟退火算法(Simulated Annealing, SA)的思想借 鉴于固体的退火原理&#xff0c;当固体的温度很高的时候&#xff0c;内能比 较大&#xff0c;固体的内部粒子处于快速无序运动&#xff0c;当温度慢慢降 低的过程中&#xff0c;固体的内能减小&#xff0c;粒子的慢慢趋于有序&a…

华三H3C S5120V3交换机的配置之组建IRF

IRF&#xff08;Intelligent Resilient Framework&#xff0c;智能弹性架构&#xff09;&#xff0c;是华三交换机实现虚拟堆叠的一种技术&#xff0c;其核心思想是将多台交换机连接在一起&#xff0c;虚拟成一台交换机&#xff0c;进而实现统一管理。和传统的堆叠概念不同&…

HTML

HTML 1. 块级标签 标题&#xff1a; <h1>一级标题</h1> div: <div>这是一个div标签</div> p&#xff1a; <p>这是一个p标签&#xff0c;段落标签</p> <!DOCTYPE html> <html lang"en"> <head><meta charse…

如何使用 ChatGPT 规划家居装修

你正在计划家庭装修项目&#xff0c;但不确定从哪里开始&#xff1f;ChatGPT 随时为你提供帮助。从集思广益的设计理念到估算成本&#xff0c;ChatGPT 可以简化你的家居装修规划流程。在本文中&#xff0c;我们将讨论如何使用 ChatGPT 有效地规划家居装修&#xff0c;以便你的项…

Redis 和 Mysql 如何保证数据一致性

项目场景&#xff1a; 一般情况下&#xff0c;Redis 用来实现应用和数据库之间读操作的缓存层&#xff0c;主要目的是减少数据库 IO&#xff0c;还可以提升数据的 IO 性能。 如下图所示&#xff0c;这是它的整体架构。 当应用程序需要去读取某个数据的时候&#xff0c;首先会先…

目标检测与跟踪 (2)- YOLO V8配置与测试

系列文章目录 第一章 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8 目标检测与跟踪 &#xff08;1&#xff09;- 机器人视觉与YOLO V8_Techblog of HaoWANG的博客-CSDN博客3D物体实时检测、三维目标识别、6D位姿估计一直是机器人视觉领域的核心研究课题&a…

[golang gin框架] 45.Gin商城项目-微服务实战之后台Rbac微服务之角色权限关联

角色和权限的关联关系在前面文章中有讲解,见[golang gin框架] 14.Gin 商城项目-RBAC管理之角色和权限关联,角色授权,在这里通过微服务来实现角色对权限的授权操作,这里要实现的有两个功能,一个是进入授权,另一个是,授权提交操作,页面如下: 一.实现后台权限管理Rbac之角色权限关…

[CVPR-23-Highlight] Magic3D: High-Resolution Text-to-3D Content Creation

目录 Abstract Background: DreamFusion High-Resolution 3D Generation Coarse-to-fine Diffusion Priors Scene Models Coarse-to-fine Optimization NeRF optimization Mesh optimization Experiments Controllable 3D Generation Personalized text-to-3D Prom…

如何选择适合您需求的新闻稿件校对软件

选择适合您需求的新闻稿件校对软件时&#xff0c;可以考虑以下几个因素&#xff1a; 1.校对功能&#xff1a;了解软件的校对功能&#xff0c;包括拼写检查、语法检查、词汇和语义检查等方面。确保软件能够满足您的基本校对需求&#xff0c;并提供准确的建议和改进意见。 2.多语…

kubesphere 部署 ingress 并使用 80 端口

文章目录 创建集群网关创建应用路由访问域名使用 80 端口 创建集群网关 官方文档&#xff1a;集群网关 点击左上角的平台管理并选择集群管理 点击导航面板中集群设置下的网关设置&#xff0c;选择集群网关选项卡&#xff0c;并点击启用网关 选择 NodePort 模式&#xff0c;配…

【CSS】说说对BFC的理解

目录 一、概念 二、BFC的布局规则 三、设置BFC的常用方式 四、BFC的应用场景 1、解决浮动元素令父元素高度坍塌的问题 2、解决非浮动元素被浮动元素覆盖问题 3、解决外边距垂直方向重合的问题 五、总结 一、概念 我们在页面布局的时候&#xff0c;经常出现以下情况&am…

go 基本语法(简单案例)

&#xff01;注&#xff1a; go中 对变量申明很是严格&#xff0c;申明了&#xff0c;在没有使用的情况下&#xff0c;也会产生编译错误 1.行分隔符 一行就是代码&#xff0c;无&#xff1b;分割&#xff0c;如果需要在一行展示&#xff0c;需要以&#xff1b;分割&#xff0c;…

Vue3 事件处理简单应用

去官网学习→事件处理 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 事件处理</h1><button v-on:click"numb 1">点击加1-----{{ numb }}</button><br/&…

安防监控视频融合EasyCVR平台接入RTSP流后设备显示离线是什么原因?

安防监控视频EasyCVR视频汇聚融合平台基于云边端智能协同架构&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台支持海量视频汇聚管理、全网分发、按需调阅、鉴权播放、智能分析等视频能力与服务。平台开放度高、兼容性强、可支持灵活拓展与第三方集成&#xff…

设计模式行为型——观察者模式

目录 什么是观察者模式 观察者模式的实现 观察者模式角色 观察者模式类图 观察者模式举例 观察者模式代码实现 观察者模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是观察者模式 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式…