pytest框架之fixture测试夹具详解

news2024/12/27 15:35:21
前言

大家下午好呀,今天呢来和大家唠唠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.coloradmin.cn/o/2203308.html

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

相关文章

DBMS-3.3 SQL(3)——DML的INSERT、UPDATE、DELETE空值的处理DCL

本文章的素材与知识来自李国良老师和王珊老师。 DML——INSERT、UPDATE、DELETE 一. INSERT 1.语法 (1)INTO子句 (2)VALUES子句 (3)示例 2.插入子查询 若插入的是子查询则不需要VALUES子句 二. UPDATE …

大数据法律监督模型平台实现常态化法律监督

大数据法律监督模型平台充分挖掘大数据价值,利用大数据关联、碰撞、比对,从海量数据中自动筛查出法律监督线索,推送给检察官,有利于提升法律监督质效。 大数据法律监督模型平台建设目标 1、提升监察机关主动监督、精准…

基于DCGM+Prometheus+Grafana的GPU监控方案

目录 前言一、指标导出器1、DCGM:获取远程节点的信息 2、 DCGM-Exporter收集多节点信息更改收集指标 二、 Prometheus - From metrics to insight修改配置文件查看收集结果 三、Grafana仪表板展示导入数据源创建仪表板更多仪表板 前言 基于DCGM(NVIDIA …

[SAP ABAP] LIKE TABLE OF

LIKE TABLE OF语句是用来参照结构体(工作区)对象定义内表数据类型的语句 在SAP ABAP中有标准表&#xff0c;排序表和哈希表三种内表数据类型 *定义标准表 DATA: <ty_tab_standard_name> LIKE [STANDARD] TABLE OF <dtype> [WITH NON-UNIQUE KEY <k1 k2 ... kn…

Python自动给课本文字标注拼音

环境&#xff1a; Ubuntu20.04&#xff0c;ubuntu20.04自带python版本 3.8.10&#xff0c;pip的版本是 20.0.2 pip install pypinyin # 安装失败&#xff0c;检查更新pip确保pip是最新版本&#xff1a; pip install --upgrade pip 检查是否安装成功 pip show pypinyin pinyin…

【电路笔记】-求和运算放大器

求和运算放大器 文章目录 求和运算放大器1、概述2、反相求和放大器3、同相求和放大器4、减法放大器5、应用5.1 音频混合器5.2 数模转换器 (DAC)6、总结1、概述 在我们之前有关运算放大器的大部分文章中,仅将一个输入应用于反相或非反相运算放大器的输入。在本文中,将讨论一种…

Python从入门到高手6.1节-字符串的定义与编码

目录 6.1.1 理解字符串 6.1.2 字符串的类型名 6.1.3 字符的数字编码 5.1.4 常用的字符编码 6.1.5 字符串的默认编码 6.1.6 字符串的编码与解码 6.1.7 转义字符详解 6.1.8 对字符串进行迭代 6.1.9 大神薯条老师 6.1.1 理解字符串 在Python中使用英文引号括住的都是字符…

CAS存在的问题及在Java中的解决方式

CAS 介绍 CAS 可以保证对共享变量操作的原子性 CAS全称Compare And Swap&#xff0c;比较与交换&#xff0c;是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。ReentrantLock内部的AQS和原子类内部都使用了CAS。 CAS算法涉及到三个操作数&#xff1a;需…

ICDE 2024最新论文分享|BEEP:容量约束下能够对抗异常干扰的航运动态定价系统

论文简介 本推文详细介绍了上海交通大学高晓沨教授和陈贵海教授团队发表在顶级学术会议ICDE 2024上发表的最新论文《Corruption Robust Dynamic Pricing in Liner Shipping under Capacity Constraint》&#xff0c;该论文的学生作者为胡永祎、李雪嫣、魏熙锴&#xff0c;合作…

Mac电脑word文档误删,4个方法快速恢复

对于使用Mac的用户来说&#xff0c;丢失重要的Word文档可能会为学习或工作带来严重的影响。不过&#xff0c;幸运的是&#xff0c;关于mac word 文档恢复方法还是有很多的&#xff0c;通常帮助Mac用户轻松找回丢失的word文档。接下来&#xff0c;小编将介绍一些在Mac上恢复丢失…

dayu_widgets-加载组件:MLoading和MLoadingWrapper

一、使用场景 点击按钮加载数据&#xff0c;但是查询数据需要一定的耗时&#xff0c;这段时间需要显示加载中的UI来进行遮罩。 二、使用效果 三、使用案例 # 学习笔记 MLoading控件 import asyncio from PySide2.QtWidgets import QWidget, QApplication, QVBoxLayout, QPus…

2024双十一究竟买什么比较好?为您精选五款双十一必购好物清单!

2024年的双十一购物狂欢节即将到来&#xff0c;许多人已经开始思考在这个一年一度的购物盛宴中究竟应该选购哪些商品。为了帮助大家更好地把握这次购物机会&#xff0c;我们精心为您挑选了五款双十一期间必购的好物清单&#xff0c;确保您能够买到物超所值的宝贝&#xff01; …

作业4-23

文章目录 标题1标题2 标题1 该不该好吧 标题2 写的PHP <?phpnamespace App\Http\Controllers;use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; us…

文心一言 VS 讯飞星火 VS chatgpt (366)-- 算法导论24.3 8题

八、给定带权重的有向图 G ( V &#xff0c; E ) G(V&#xff0c;E) G(V&#xff0c;E) &#xff0c;其权重函数为 w : E → ( 0 &#xff0c; 1 &#xff0c; 2. … &#xff0c; W ) w:E→(0&#xff0c;1&#xff0c;2.…&#xff0c;W) w:E→(0&#xff0c;1&#xff0c…

RK3568 buildroot系统在安装popt出错的问题

RK3568 buildroot系统在安装popt出错的问题 简介 使用 buildroot 系统给 RK3568 制作系统的时候,编译系统到 popt 这个组件时,编译出错 故障现象 gzip: popt-1.16.tar.gz: not in gzip format 上面的报错就是说 gzip 认为这个压缩包不是可以识别的格式 问题复现 我们进…

996是性价比最低的工作方式,没有之一!

不知道从什么时候开始&#xff0c;“996”工作制&#xff08;即每周工作从早9点至晚9点&#xff0c;持续6天&#xff09;已经从网络热梗&#xff0c;变成了不少企业和职场人的“工作常态”。 尤其是现如今职场中越来越频繁的裁员降薪&#xff0c;为了保住一份工作&#xff0c;…

浅入深出之了解常见的用户登录校验

文章目录 一、Cookie-Session认证校验流程缺点 二、Token校验流程缺点 三、JWT校验流程 四、JWT令牌的实践使用JWT组成引入依赖生成令牌 前言 在讲解这个问题之前&#xff0c;我们要先搞清楚基本的用户登录流流程。 用户在web登录页面填写登录信息前端发送登录信息到后端后端接…

[红队apt]CHM电子书攻击/电子教程攻击

免责声明:本文用于了解攻击者的攻击手法&#xff0c;切勿用于不法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文主要整理当初电子书的时代&#xff0c;利用电子书攻击的操作 CHM电子书简介 这个在当初普遍用于做教程课件&#xff0c;软件说明等应用。…

音频响度归一化 - python 实现

在处理音频样本时&#xff0c;往往我们的音频样本由于录制设备&#xff0c;环境&#xff0c;人发音的音量大小的不同影响&#xff0c;会造成音频响度不统一&#xff0c;分布在一个不同的响度值域上。为了让语音模型更好的学习音频特征&#xff0c;就有必要对音频的响度进行归一…

android中byte[] buf没有结束符,new String(buf)会不会出错?

答案是&#xff1a;不会 看例子&#xff1a; 这和c是不一样的&#xff0c;不需要特别的在字符串后面添加一个\0结束.