pytest自动化测试 - pytest夹具的基本概念

<< 返回目录

1 pytest自动化测试 - pytest夹具的基本概念

  夹具可以为测试用例提供资源(测试数据)、执行预置条件、执行后置条件,夹具可以是函数、类或模块,使用@pytest.fixture装饰器进行标记。

1.1 夹具的作用范围

  夹具的作用范围:

  • 函数范围:夹具默认范围是函数级,即,每个测试函数执行时,都会执行一遍夹具的前置和后置条件
  • 类范围:夹具的前置条件在类的第一个测试函数执行前执行,在类的最后一个测试函数执行后执行。
  • 模块范围:夹具的前置条件在模块的第一个测试函数执行前执行,在模块的最后一个测试函数执行后执行。
  • 会话范围:夹具的前置条件在测试会话开始时执行一次,后置条件在测试会话结束时执行一次。

1.1.1 函数范围的夹具

  默认(未指定参数)时是函数级的范围。

import pytest@pytest.fixture
def setup_resource():# 准备资源resource = "This is a test resource"print("\n" + "="*65)print("BEGIN: 用例预置条件.")yield resource# 清理资源print("END: 用例`后置条件`.")def test_with_fixture(setup_resource):print("第一个用例开始".center(70))assert "test resource" in setup_resourceprint("第一个用例结束".center(70))def test_another_with_fixture(setup_resource):print("第二个用例开始".center(70))assert len(setup_resource) > 10print("第二个用例结束".center(70))

  yield前的语句是前置条件yield后的语句是后置条件。夹具中的前置条件后置条件,在每个测试用例中都会执行。

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 itemstest_ft_subf_fixture_001.py 
=================================================================
BEGIN: 用例预置条件.第一个用例开始                                第一个用例结束                                
.END: 用例`后置条件`.=================================================================
BEGIN: 用例预置条件.第二个用例开始                                第二个用例结束                                
.END: 用例`后置条件`.============================== 2 passed in 0.01s ==============================

  从报文可以看到,夹具中的前置条件在用例开始前执行,后置条件,在用例执行结束时执行。

1.1.2 类范围的夹具

  通过参数@pytest.fixture(scope="class")可以指定夹具的类范围

import pytest@pytest.fixture(scope="class")
def setup_class_resource():resource = "Class resource"print("\n" + "=" * 65)print("【预置条件】")yield resourceprint("【`后置条件`】.")class TestClassWithFixture:def test_class_fixture(self, setup_class_resource):print("第1个测试用例开始.")assert "Class" in setup_class_resourceprint("第1个测试用例结束.\n")def test_another_class_fixture(self, setup_class_resource):print("第2个测试用例开始.")assert len(setup_class_resource) > 10print("第2个测试用例结束.")

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 2 itemstest_ft_fixture_class_001.py 
=================================================================
【预置条件】
第1个测试用例开始.
第1个测试用例结束..第2个测试用例开始.
第2个测试用例结束.
.【`后置条件`】.============================== 2 passed in 0.01s ==============================

1.1.3 模块范围的夹具

  前置条件在模块第一个测试函数执行前执行,后置条件在最后一个函数执行后执行。

import pytest@pytest.fixture(scope="module")
def setup_module_resource():resource = "Module resource"print("\n" + "=" * 65)print("【预置条件】")yield resourceprint("【`后置条件`】")def test_module_fixture1(setup_module_resource):print("第1个用例开始")assert "Module" in setup_module_resourceprint("第1个用例结束\n")def test_module_fixture2(setup_module_resource):print("第2个用例开始")assert len(setup_module_resource) > 10print("第2个用例结束\n")#这个函数函数没有使用夹具
def test_module_fixture3():print("第3个用例开始")assert len("测试不用夹具的函数是否会干扰") > 10print("第3个用例结束")

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 3 itemstest_ft_fixture_module_001.py 
=================================================================
【预置条件】
第1个用例开始
第1个用例结束.第2个用例开始
第2个用例结束.第3个用例开始
第3个用例结束
.【`后置条件`】============================== 3 passed in 0.01s ==============================

  说明:模块中即使存在测试函数没有使用夹具,也不会干扰夹具中的预置条件和后置条件,预置条件始终保存在模块开始执行前执行,后续条件在模块的所有函数执行完时执行。

1.1.4 会话范围的夹具

  下面的示例探索模块范围和会话范围的区别,其中test_ft_fixture_module_001是上一个示例中的模块范围的测试代码,使用from test_ft_fixture_module_001 import *将模块的所有夹具和用例导入到本用例。

import pytest
from test_ft_fixture_module_001 import *@pytest.fixture(scope="session")
def setup_session_resource():resource = "Session resource"print("\n" + "=" * 65)print("【会话-`前置条件`】")yield resourceprint("【会话-`后置条件`】")def test_session_fixture1(setup_session_resource):print("会话-第1个用例开始")assert "Session" in setup_session_resourceprint("会话-第1个用例结束\n")def test_session_fixture2(setup_session_resource):print("会话-第2个用例开始")assert len(setup_session_resource) > 10print("会话-第2个用例结束\n")def test_session_fixture3():print("会话-第3个用例开始")assert len("测试没有使用夹具的第3个用例对`后置条件`的影响") > 10print("会话-第3个用例结束")

输出:

============================= test session starts =============================
platform win32 -- Python 3.13.1, pytest-8.3.4, pluggy-1.5.0
rootdir: D:\TYYSOFT\Study\Python\pytest
collected 6 itemstest_ft_fixture_session_001.py 
=================================================================
【模块-预置条件】
模块-第1个用例开始
模块-第1个用例结束.模块-第2个用例开始
模块-第2个用例结束.模块-第3个用例开始
模块-第3个用例结束
.
=================================================================
【会话-`前置条件`】
会话-第1个用例开始
会话-第1个用例结束.会话-第2个用例开始
会话-第2个用例结束.会话-第3个用例开始
会话-第3个用例结束
.【模块-`后置条件`】
【会话-`后置条件`】============================== 6 passed in 0.02s ==============================

从执行结果来看,模块的预置条件在最开始执行,紧随其后的是导入的模块中的测试函数,而会话的前置条件只在当前模块执行前才执行,后置条件是先执行了模块的后置条件,再执行会话的后置条件


作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来源自豆包AI,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

<< 返回目录

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

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

相关文章

esp32-C3 实现DHT11(温湿度)

安装DHT传感器库&#xff1a; 在Arduino IDE中&#xff0c;进入项目 > 加载库 > 管理库。搜索DHT sensor library并安装。 编写代码 定义引脚和传感器类型初始化传感器判断传感器是否正常读取数据 源码 #include <DHT.h> #include <DHT_U.h>// 定义DHT传感器…

【Pytest】生成html报告中,中文乱码问题解决方案

import pytestif __name__ "__main__":# 只运行 tests 目录下的测试用例&#xff0c;并生成 HTML 报告pytest.main([-v, -s, --htmlreport.html, tests])可以以上方式生成&#xff0c;也可以在pytest.ini中设置 [pytest] addopts --htmlreport.html --self-contai…

MyBatis最佳实践:提升数据库交互效率的秘密武器

第一章&#xff1a;框架的概述&#xff1a; MyBatis 框架的概述&#xff1a; MyBatis 是一个优秀的基于 Java 的持久框架&#xff0c;内部对 JDBC 做了封装&#xff0c;使开发者只需要关注 SQL 语句&#xff0c;而不关注 JDBC 的代码&#xff0c;使开发变得更加的简单MyBatis 通…

《Java程序设计》课程考核试卷

一、单项选择题&#xff08;本大题共10个小题&#xff0c;每小题2分&#xff0c;共20分&#xff09; 1.下列用来编译Java源文件为字节码文件的工具是&#xff08; &#xff09;。 A.java B.javadoc C.jar D.javac 2…

【25考研】人大计算机考研复试该怎么准备?有哪些注意事项?

人大毕竟是老牌985&#xff0c;复试难度不会太低&#xff01;建议同学认真复习&#xff01;没有机试还是轻松一些的&#xff01; 一、复试内容 由公告可见&#xff0c;复试包含笔试及面试&#xff0c;没有机试&#xff01; 二、参考书目 官方无给出参考书目&#xff0c;可参照…

使用openwrt搭建ipsec隧道

背景&#xff1a;最近同事遇到了个ipsec问题&#xff0c;做的ipsec特性&#xff0c;ftp下载ipv6性能只有100kb, 正面定位该问题也蛮久了&#xff0c;项目没有用openwrt, 不过用了开源组件strongswan, 加密算法这些也是内核自带的&#xff0c;想着开源的不太可能有问题&#xff…

[STM32 - 野火] - - - 固件库学习笔记 - - -十一.电源管理系统

一、电源管理系统简介 电源管理系统是STM32硬件设计和系统运行的基础&#xff0c;它不仅为芯片本身提供稳定的电源&#xff0c;还通过多种电源管理功能优化功耗、延长电池寿命&#xff0c;并确保系统的可靠性和稳定性。 二、电源监控器 作用&#xff1a;保证STM32芯片工作在…

数字图像处理:实验六

uu们&#xff01;大家好&#xff0c;2025年的新年就要到来&#xff0c;咸鱼哥在这里祝大家在2025年每天开心快乐&#xff0c;天天挣大钱&#xff0c;自由自在&#xff0c;健健康康&#xff0c;万事如意&#xff01;&#xff08;要是咸鱼哥嘴笨的话&#xff0c;还望大家多多包涵…

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…

上海亚商投顾:沪指冲高回落 大金融板块全天强势 上海亚商投

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一&#xff0e;市场情绪 市场全天冲高回落&#xff0c;深成指、创业板指午后翻绿。大金融板块全天强势&#xff0c;天茂集团…

kaggle比赛入门 - House Prices - Advanced Regression Techniques(第二部分)

本文承接上一篇 1. 分析住宅类型&#xff08;BldgType&#xff09;的分布以及它们与销售价格&#xff08;SalePrice&#xff09;的关系 # 1. distribution of dwelling types and their relation to sale prices # BldgType: Type of dwellingdwelling_types df[BldgType].v…

使用shell命令安装virtualbox的虚拟机并导出到vagrant的Box

0. 安装virtualbox and vagrant [rootolx79vagrant ~]# cat /etc/resolv.conf #search 114.114.114.114 nameserver 180.76.76.76-- install VirtualBox yum install oraclelinux-developer-release-* wget https://yum.oracle.com/RPM-GPG-KEY-oracle-ol7 -O /etc/pki/rpm-g…

【数据结构】空间复杂度

目录 一、引入空间复杂度的原因 二、空间复杂度的分析 ❥ 2.1 程序运行时内存大小 ~ 程序本身大小 ❥ 2.2 程序运行时内存大小 ~ 算法运行时内存大小 ❥ 2.3 算法运行时内存大小 ❥ 2.4 不考虑算法全部运行空间的原因 三、空间复杂度 ❥ 3.1空间复杂度的定义 ❥ 3.2 空…

MySQL--》深度解析InnoDB引擎的存储与事务机制

目录 InnoDB架构 事务原理 MVCC InnoDB架构 从MySQL5.5版本开始默认使用InnoDB存储引擎&#xff0c;它擅长进行事务处理&#xff0c;具有崩溃恢复的特性&#xff0c;在日常开发中使用非常广泛&#xff0c;其逻辑存储结构图如下所示&#xff0c; 下面是InnoDB架构图&#xf…

Redis高阶5-布隆过滤器

Redis布隆过滤器 ​ 由一个初始值都为零的bit数组和多个哈希函数构成&#xff0c;用来快速判断集合中是否存在某个元素 目的减少内存占用方式不保存数据信息&#xff0c;只是在内存中做一个是否存在的标记flag 布隆过滤器&#xff08;英语&#xff1a;Bloom Filter&#xff0…

DeepSeek学术题目选择效果怎么样?

论文选题 一篇出色的论文背后&#xff0c;必定有一个“智慧的选题”在撑腰。选题足够好文章就能顺利登上高水平期刊&#xff1b;选题不行再精彩的写作也只能“当花瓶”。然而许多宝子们常常忽视这个环节&#xff0c;把大量时间花在写作上&#xff0c;选题时却像抓阄一样随便挑一…

Docker核心命令与Yocto项目的高效应用

随着软件开发逐渐向分布式和容器化方向演进&#xff0c;Docker 已成为主流的容器化技术之一。它通过标准化的环境配置、资源隔离和高效的部署流程&#xff0c;大幅提高了开发和构建效率。Yocto 项目作为嵌入式 Linux 系统构建工具&#xff0c;与 Docker 的结合进一步增强了开发…

Qt 5.14.2 学习记录 —— 이십 QFile和多线程

文章目录 1、QFile1、打开2、读写3、关闭4、程序5、其它功能 2、多线程1、演示2、锁 3、条件变量和信号量 1、QFile Qt有自己的一套文件体系&#xff0c;不过Qt也可以使用C&#xff0c;C&#xff0c;Linux的文件操作。使用Qt的文件体系和Qt自己的一些类型更好配合。 管理写入读…

多版本并发控制:MVCC的作用和基本原理

多版本并发控制&#xff1a;MVCC的作用和基本原理 1、MVCC简介1.1 快照读与当前读的区别1.1.1 快照读1.1.2 当前读 1.2 数据库的读写问题1.3 MVCC的作用 2、MVCC实现原理之ReadView2.1 什么是ReadView2.2 ReadView的设计思路2.3 MVCC整体操作流程 1、MVCC简介 1.1 快照读与当前…

神经网络|(二)sigmoid神经元函数

【1】引言 在前序学习进程中&#xff0c;我们已经了解了基本的二元分类器和神经元的构成&#xff0c;文章学习链接为&#xff1a; 神经网络|(一)加权平均法&#xff0c;感知机和神经元-CSDN博客 在此基础上&#xff0c;我们认识到神经元本身在做二元分类&#xff0c;是一种非…