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.mfbz.cn/a/889202.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于SSM医疗信息管理系统(源码+定制+参考)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图)

Python数字图像处理实战——基于OpenCV实现多种滤波器(附完整代码和结果图) 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测…

分辨率提高4到8倍!AI高清修复工具-upscayl使用方法!

你还在为手中的模糊照片苦恼吗? 是不是想把老照片或低分辨率的图片用于大尺寸印刷,却因为画质糟糕而无从下手? 现在你不再需要高深的Photoshop技能,也不用花费巨资找人修图。借助AI高清修复工具Upscayl,只需几秒钟&am…

Python、R语言Lasso、Ridge岭回归、XGBoost分析Airbnb房屋数据:旅游市场差异、价格预测

全文链接:https://tecdat.cn/?p37839 原文出处:拓端数据部落公众号 分析师: Kefan Yu 在大众旅游蓬勃发展的背景下,乡村旅游已成为推动乡村经济、社会和文化发展的关键力量。当前,乡村旅游接待设施主要以招待所、…

基于Python的抑郁症患者看护系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

如何实现Vue2项目升级Vue3?

Vue3正式版已经发布有两年多了,如今它也已成为Vue的默认开发版本,如果你想要对之前Vue2项目进行升级重构,可以从以下几个维度入手: ① 构建工具 ② 入口文件 ③ 插件 ④ 指令 ⑤ 路由 ⑥ 状态管理 ⑦ 其他 一、构建工具 Vue3推荐使…

HTB:Base[WriteUP]

目录 连接至HTB服务器并启动靶机 1.Which two TCP ports are open on the remote host? 2.What is the relative path on the webserver for the login page? 3.How many files are present in the /login directory? 4.What is the file extension of a swap file? …

springboot如何集成mybatis?

背景:以前一直是直接cv一个项目中现成的xml文件,然后再去自己配置mapper等数据。自己准备做一个单独的例子试一下。 步骤1:在pom.xml文件中插入mybatis-generator插件,这里选的版本是1.3.2,然后指定的generator文件是在…

IDM6.42下载器!下载速度就像坐上了火箭,嗖嗖的快到飞起!

亲爱的朋友们,今天我要给大家安利一款下载神器——Internet Download Manager 6.42(简称IDM)!这款软件简直就是下载界的“速度与激情”,用了它之后,你会发现下载速度就像坐上了火箭,嗖嗖的快到飞…

Python 如何使用 SQLAlchemy 进行复杂查询

Python 如何使用 SQLAlchemy 进行复杂查询 一、引言 SQLAlchemy 是 Python 生态系统中非常流行的数据库处理库,它提供了一种高效、简洁的方式与数据库进行交互。SQLAlchemy 是一个功能强大的数据库工具,支持结构化查询语言(SQL)…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站:Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符,拉取 GitLab 镜像: docker pull gitlab/gitlab-ee:latest或则使用社区版: docker pull gitlab/gitlab-ce…

【C++】STL——stack和queue

目录 前言容器配接器(适配器)stack的使用stack的模拟实现queue的使用queue的模拟实现双端队列(deque) 前言 前面我们已经学习了STL容器中的string、vector还有list。 【C】string的模拟实现 【C】STL——vector的模拟实现 【C】S…

CTF-PWN方向 栈溢出等基础知识笔记(2)

ret2syscall 要求有0x80这种系统调用存在 (0x0A是回车的意思) 案例 通过file查看这个文件 发现是静态编译的文件 所以很多库函数都被编译进去了 但是不存在bin/sh字符串 不存在system和backdoor函数 系统调用需要用到的寄存器 通过ROPgadget工具来查找…

传统图像处理Opencv分割不同颜色的夹子

任务要求🍉 1. 计算图像中夹子的总数。 2. 分别计算不同颜色夹子的个数。 3. 使用以下方法适应三张图片,并在每张图像上显示结果: - 阈值方法 - HSV颜色空间 - 连通域分析 - 形态学图像处理 - Canny边缘检测 4. 在结果中显示计…

《数据密集型应用系统设计》笔记——第二部分 分布式数据系统(ch5-9)

第5章 数据复制 目的: 地理位置更近,降低延迟故障冗余提高读吞吐量 主节点与从节点(主从复制) 主从复制: 写请求发送给主节点,主节点将新数据写入本地存储;主节点将数据更改作为复制的日志发送…

使用java做一个微信机器人

微信机器人这个功能,目前在市面上运用的还是不是很多,每个人实现机器人的目的也不一样,有的为了自动加好友;有的为了自动拉群:也有的为了机器人对话聊天等等一系列。想必大家对微信机器人感兴趣的伙伴,但是大多数走到一半遇到各种…

Android Jetpack Compose中UI刷新的几种方式

Android Jetpack Compose中UI刷新的几种方式 在 Jetpack Compose 中,如果你想强制刷新 UI,可以使用 remember 和 mutableStateOf 来创建一个可观察的状态。当这个状态变化时,Compose 会自动重组 UI。以下是一些常见的方法来实现这一点: 1. 使用 mutableStateOf 你可以使…

[SQL] 安装

一 Windows 1.1 下载 进入Mysql的官方网站,点击下载->找到社区版本 选择对应操作系统进行下载。 点击下载 选择直接下载即可 1.2 安装 选择Full安装: MySQL服务器、客户端程序和其他附加工具如果只需要服务端那就选择Server only即可 点击执行,等待组件下载完…

【Unity踩坑】UWP项目安装包认证失败

问题:在Unity导出的VS项目,打包生成appx后,进行应用认证时失败。提示部分API不支持。 API __C_specific_handler in kernel32.dll is not supported for this application type. UnityPlayer.dll calls this API.API DXGIGetDebugInterface1 …

Windows 搭建 Gitea

一、准备工作 1. 安装 Git:Gitea 依赖 Git 进行代码管理,所以首先需要确保系统中安装了 Git。 下载地址:https://git-scm.com/downloads/win 2. 安装数据库(可选) 默认情况下,Gitea 使用 SQLite 作为内…