pytest框架之fixture测试夹具详解

前言

大家下午好呀,今天呢来和大家唠唠pytest中的fixtures夹具的详解,废话就不多说了咱们直接进入主题哈。

一、fixture的优势

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

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

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

  1. @pytest.fixture()

  2. def my_fixture(): # 记住这个夹具名

  3. print("我的测试夹具")

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

  • 方式一:将fixture名称作为参数传给测试用例,可以传多个fixture,按先后顺序执行
  • 方式二:装饰器:@pytest.mark.usefixtures(fixture_name)使用在类上,代表这个类所有测试用例都会调用这个fixture使用在用例上,代表只有这个用例调用这个fixture同样可以使用多个fixture,按先后顺序执行如果fixture有返回值,用这个装饰器是无法获取到返回值的,也就无法给用例传递数据,只能用方法一
  • 方式三:fixture设置autouse=True自动调用,同样fixture有返回值时,无法获取返回值
  1. import pytest

  2. @pytest.fixture()

  3. def my_fixture(): # 记住这个夹具名

  4. print("我的测试夹具")

  5. # 方式一

  6. def test_fix1(my_fixture):

  7. print("这是测试用例1111")

  8. print("-------分割线------")

  9. # 方式二

  10. # 类中应用

  11. @pytest.mark.usefixtures("my_fixture")

  12. class TestLogin:

  13. def test_fix2(self):

  14. print("这是测试用例2222")

  15. print("-------分割线------")

  16. def test_fix3(self):

  17. print("这是测试用例3333")

  18. print("-------分割线------")

  19. # 测试用例应用

  20. @pytest.mark.usefixtures("my_fixture")

  21. def test_fix4():

  22. print("这是测试用例4444")

  23. print("-------分割线------")

  24. # 方式三

  25. def test_fix5(): # 未声明使用测试夹具

  26. print("这是测试用例5555")

  27. if __name__ == "__ma__":

  28. pytest.main()

​ 运行结果:

 
  1. Testing started at 23:12 ...

  2. C:\software\python\python.exe ...

  3. test.py 我的测试夹具

  4. .这是测试用例1111

  5. -------分割线------

  6. 我的测试夹具

  7. .这是测试用例2222

  8. -------分割线------

  9. 我的测试夹具

  10. .这是测试用例3333

  11. -------分割线------

  12. 我的测试夹具

  13. .这是测试用例4444

  14. -------分割线------

  15. .这是测试用例5555

  16. [100%]

  17. ============================== 5 passed in 0.02s ==============================

  18. Process finished with exit code 0

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

  1. @pytest.fixture(autouse=True) # 设置用例自动调用该fixture

  2. def my_fixture():

  3. print("我的测试夹具")

三、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的场景:

  1. # 因为用于演示,因此测试夹具直接写在py文件中

  2. import pytest

  3. from selenium import webdriver

  4. @pytest.fixture(scope='class')

  5. def my_fixture():

  6. """前置条件"""

  7. print("前置条件-启动浏览器")

  8. driver = webdriver.Chrome()

  9. yield driver

  10. driver.quit()

  11. print("后置条件-关闭浏览器")

  12. class TestCase:

  13. def test_case01(self, my_fixture): # 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixture

  14. driver = my_fixture # my_fixture不需要加括号

  15. driver.get('http://www.baidu.com')

  16. print('第一个用例')

  17. assert 1 == 1

  18. def test_case02(self, my_fixture): # 这里通过参数传入my_fixture函数,用例执行前会先去执行my_fixture

  19. driver = my_fixture # my_fixture不需要加括号

  20. driver.get('http://www.cnblogs.com/')

  21. print('第二个用例')

  22. assert 1 == 1

  23. if __name__ == '__ma__':

  24. pytest.main(['test.py', '-s'])

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

  1. C:\software\python\python.exe D:/learn/test.py

  2. ============================= test session starts =============================

  3. platform win32 -- Python 3.7.3, pytest-5.2.2, py-1.8.0, pluggy-0.13.0

  4. rootdir: D:\learn

  5. plugins: html-2.0.0, metadata-1.8.0

  6. collected 2 items

  7. test.py 前置条件-启动浏览器

  8. 第一个用例

  9. .第二个用例

  10. .后置条件-关闭浏览器

  11. ============================== 2 passed in 9.76s ==============================

  12. Process finished with exit code 0

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

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

  1. # 因为用于演示,因此测试夹具直接写在py文件中

  2. import pytest

  3. from selenium import webdriver

  4. @pytest.fixture(scope='class', autouse=True) # 所有类自动执行该测试夹具

  5. def my_fixture():

  6. """前置条件"""

  7. print("前置条件-启动浏览器")

  8. driver = webdriver.Chrome()

  9. yield driver

  10. driver.quit()

  11. print("后置条件-关闭浏览器")

  12. class TestCase:

  13. def test_case01(self): # 不需要传入测试夹具

  14. print('第一个用例')

  15. assert 1 == 1

  16. def test_case02(self):

  17. print('第二个用例')

  18. assert 1 == 1

  19. if __name__ == '__ma__':

  20. pytest.main(['test.py', '-s'])

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

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

相关文章

谁说电商选品找货源没有捷径,只要你用对工具!

最近跟很多同行聊,都在抱怨选品难的问题,都说7分靠选品,3分靠运营,对于选品来说,并没有捷径可走,但其实是有很多不同的角度的。 现在市面上大部分开发做的选品,“选品方法”或“产品分析方法”…

【含文档】基于Springboot+Android的校园论坛系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

前端省市区组件

官网 Element UI 级联 中国省市区数据. Latest version: 5.0.2, last published: 2 years ago. Start using element-china-area-data in your project by running npm i element-china-area-data. There are 114 other projects in the npm registry using element-china-are…

SpringBoot开发——SpringSecurity安全框架17个业务场景案例(三)

文章目录 一、Spring Security 常用应用场景介绍二、Spring Security场景案例12 表达式支持(Expression-Based)12.1 Spring Security 配置12.2 业务逻辑代码12.3 控制器13、安全上下文(Security Context)13.1 Spring Security 配置13.2 业务逻辑代码13.3 控制器14、安全过滤…

Python入门笔记(四)

文章目录 第九章 集合set9.1 创建集合:set()、集合生成式9.2 集合性质9.3 一些函数:issubset()、issuperset()、isdisjoint()9.4 集合增加元素:add()、update()9.5 集合删除元素:remove()、discard()、pop()、clear()9.6 创建不能…

用IntStream生成0到n的流,并找出不在numSet中的数字列表

这是用IntStream生成0到n的流,并找出不在numSet中的数字-CSDN博客的升级版 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。 先看这题低…

数据结构与算法——Java实现 32.堆

人的想法和感受是会随着时间的认知改变而改变, 原来你笃定不会变的事,也会在最后一刻变得释然 —— 24.10.10 堆 堆是基于二叉树实现的数据结构 大顶堆每个分支的上一个节点的权值要大于它的孩子节点 小顶堆每个分支的上一个节点的权值要小于它的孩子…

Linux系统通过编辑crontab来设置定时任务---定时关机

在Linux系统中,crontab 是用来设置周期性被执行的指令的守护进程。通过编辑 crontab,您可以安排定时任务,比如定时关机、定时备份文件、定时运行脚本等。以下是如何编辑 crontab 来设置定时任务的步骤: 打开终端:您可以…

25.第二阶段x86游戏实战2-背包属性补充

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

k8s 1.28.2 集群部署 MinIO 分布式存储

文章目录 [toc]MinIO 介绍MinIO 生产硬件要求MinIO 存储要求MinIO 内存要求MinIO 网络要求MinIO 部署架构分布式 MinIO复制的 MinIO 部署 MinIO创建目录节点打标签创建 namespace创建 pv创建 MinIO配置 ingress问题记录通过代理服务器访问 MinIO 的 Object Browser 界面一直显示…

免费获取的8个SVG图标库,轻松下载与复制!

SVG图标相比传统的JPG、PNG图标具有诸多优势,适用于各种类型的图像,不仅能在不同尺寸下保持清晰度,还具备高度压缩性和轻量特性,支持静态和动态效果。因此,SVG格式在网页设计中往往是优选。尽管如今有很多免费的图标库…

微信小程序-APP-软件开发

微信小程序开发,作为当下移动互联网领域的一股强劲势力,正以其便捷性、轻量化及高用户粘性的特点,深刻改变着我们的生活与工作方式。它不仅为企业和个人开发者提供了一个全新的服务入口,更极大地拓宽了商业应用的边界。 在微信小…

python+request+unittest+ddt自动化框架

参考资料: 用户中心 - 博客园 抓包模拟器笔记 肖sir__接口自动化pythonrequestddt(模版) - xiaolehua - 博客园 pythonrequestunittestddt自动化框架 博文阅读密码验证 - 博客园 肖sir__python之模块configparser - xiaolehua - 博客园 c…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生: 最近开发项目的时候,遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候,有一个图片上传的接口,需要将byte[]转为MultipartFile 对象,但是发现根本没有这样的工具类,后面翻阅…

python list, tuple dict,set的区别 以及**kwargs 的基本用法

在python中, list, tuple, dict, set有什么区别, 主要应用在什么样的场景? 定义: list:链表,有序的项目, 通过索引进行查找,使用方括号”[]”; tuple:元组,元组将多样的对象集合到一起,不能修改,通过索引进行查找, 使用括号”()”; dict:字典,字典是一组键(key)和值(value…

多元线性回归:机器学习中的经典模型探讨

引言 多元线性回归是统计学和机器学习中广泛应用的一种回归分析方法。它通过分析多个自变量与因变量之间的关系,帮助我们理解和预测数据的行为。本文将深入探讨多元线性回归的理论背景、数学原理、模型构建、技术细节及其实际应用。 一、多元线性回归的背景与发展…

【杭州马拉松:文化之旅,感受千年古城的魅力】

杭州马拉松,作为国内外知名的马拉松赛事,一直以来都以其独特的魅力和严谨的组织而备受瞩目。今年,杭马将于11月3日再次鸣枪起跑,为跑者们提供一个挑战自我、超越极限的舞台。赛事主办方在今年的比赛中引入了多项创新举措&#xff…

经典蓝牙BLE版本区别:【图文讲解】

蓝牙是一种短距的无线通讯技术,可实现固定设备、移动设备之间的数据交换。一般将蓝牙3.0之前的BR/EDR蓝牙称为传统蓝牙,而将蓝牙4.0规范下的LE蓝牙称为低功耗蓝牙(BLE)。 1:蓝牙4.0 BLE 4.0版本是3.0版本的升级版本&a…

20240904 华为笔试 二叉树消消乐

文章目录 题目解题思路代码BUG 代码最终代码题目 题目描述 给定原始二叉树和参照二叉树(输入的二叉树均为满二叉树,二叉树节点的值范围为[1,1000],二叉树的深度不超过1000),现对原始二叉树和参照二又树中相同层级目值相同的节点进行消除,消除规则为原始二叉树和参照二又树中…

Tetra Pak利乐触摸屏维修beijer北尔触摸屏维修E1151

TetraPak利乐包装机触摸显示屏维修,北尔全系列型号触摸屏修理 维修注意事项: 上电前,应检查负载是否接上或是否正确; 测量电压时,确认档位是否在电压档。要确认仪器仪表的量程应大于测试点的电压; 更换电…