Python模块pytest全局初始化和局部初始化前置后置操作

news2024/12/24 3:24:31

在 pytest 中,我们可以通过 conftest.py 文件来实现全局的前置和后置操作。

conftest.py 文件是一个特殊的 pytest 文件,它可以定义一些 fixture 和钩子函数,这些 fixture 和钩子函数可以在当前目录及其子目录下的所有测试文件中使用。

下面是一个例子,假设我们在一个名为 tests 的文件夹下编写了多个测试用例文件,我们希望在所有测试用例执行前和执行后都进行一些操作,可以在 tests 目录下创建一个名为 conftest.py 的文件,并定义两个 fixture 函数 global_setupglobal_teardown,代码如下:

import pytest

@pytest.fixture(scope='session')
def global_setup():
    print("\n======= Global setup =======")
    yield
    print("\n======= Global teardown =======")

@pytest.fixture(scope='function')
def some_fixture():
    print("Some fixture")

@pytest.fixture(scope='session')
def global_teardown():
    print("\n======= Global cleanup =======")

在这个例子中,我们定义了两个 fixture 函数 global_setupglobal_teardown,它们的作用域分别是 session 和 function。global_setup 函数会在所有测试用例执行前被调用一次,global_teardown 函数会在所有测试用例执行后被调用一次。

注意,这里我们使用了 pytest 的 fixture 参数 scope 来指定 fixture 函数的作用域。scope 参数可以有四个值:

  • function:fixture 函数的作用域为测试用例级别,每个测试用例执行前都会调用一次 fixture 函数;
  • class:fixture 函数的作用域为测试类级别,每个测试类执行前都会调用一次 fixture 函数;
  • module:fixture 函数的作用域为模块级别,即每个 Python 模块执行前都会调用一次 fixture 函数;
  • session:fixture 函数的作用域为整个测试会话级别,即所有测试用例执行前都会调用一次 fixture 函数。

需要注意的是,fixture 函数的作用域不能超过其定义的文件的作用域。比如,在一个 pytest 测试文件中定义的 fixture 函数的作用域最大只能是 module,无法超过该文件的作用域。

接下来,在我们的测试用例文件中,我们可以通过传入 global_setupglobal_teardown fixture 来使用全局的前置和后置操作。例如:

def test_addition(some_fixture, global_setup, global_teardown):
    assert 2 + 2 == 4

在这个例子中,我们将 global_setupglobal_teardown fixture 分别传入测试用例函数 test_addition 中,这样在执行测试用例前会先执行一次全局的前置操作,测试用例结束后会再执行一次全局的后置操作。需要注意的是,为了使 fixture 函数按照正确的顺序执行,我们将 global_setupglobal_teardown fixture 放在了 some_fixture fixture 的后面。

这样就可以实现全局的前置和后置操作了。如果我们在 conftest.py 文件中定义了多个 fixture,那么这些 fixture 在所有测试用例中都可以被使用。同时,由于 pytest 的 fixture 可以被其他 fixture 所依赖,因此我们可以将多个 fixture 组合起来,实现更加复杂的测试场景。

在 pytest 中,我们可以通过 conftest.py 文件来实现全局的初始化操作。

conftest.py 文件是一个特殊的 pytest 文件,它可以定义一些 fixture 和钩子函数,这些 fixture 和钩子函数可以在当前目录及其子目录下的所有测试文件中使用。

下面是一个例子,假设我们在一个名为 tests 的文件夹下编写了多个测试用例文件,我们希望在所有测试用例执行前进行一些初始化操作,可以在 tests 目录下创建一个名为 conftest.py 的文件,并定义一个 fixture 函数 global_init,代码如下:

import pytest

@pytest.fixture(scope='session', autouse=True)
def global_init():
    print("\n======= Global initialization =======")
    # 执行初始化操作
    yield
    print("\n======= Global cleanup =======")
    # 执行清理操作

在这个例子中,我们定义了一个 fixture 函数 global_init,它的作用域为 session,也就是整个测试会话期间只会被调用一次,且自动使用,不需要在测试用例中显式调用。

global_init fixture 函数中,我们可以执行全局的初始化操作,例如读取配置文件、连接数据库等。在执行完初始化操作后,我们使用 yield 关键字将控制权交给后续的测试用例,等到所有测试用例执行完毕后,再回到 global_init fixture 函数中,执行全局清理操作。需要注意的是,yield 语句前面的所有代码都是初始化操作,yield 语句后面的所有代码都是清理操作。

接下来,在我们的测试用例文件中,我们就可以直接使用全局初始化后的资源了。例如:

def test_addition():
    assert 2 + 2 == 4

def test_subtraction():
    assert 3 - 1 == 2

在这个例子中,我们没有显式地调用任何初始化函数,但是在执行测试用例前,global_init fixture 函数会被自动调用,执行全局的初始化操作。测试用例执行完毕后,global_init fixture 函数会再次被自动调用,执行全局的清理操作。

这样就可以实现全局的初始化操作了。如果我们在 conftest.py 文件中定义了多个 fixture,那么这些 fixture 在所有测试用例中都可以被使用。同时,由于 pytest 的 fixture 可以被其他 fixture 所依赖,因此我们可以将多个 fixture 组合起来,实现更加复杂的测试场景。

例如:

全局目录:

 conftest.py内容

import pytest

@pytest.fixture(scope='session', autouse=True)
def global_init():
    print("\n======= Global initialization =======")
    # 执行初始化操作
    yield
    print("\n======= Global cleanup =======")
    # 执行清理操作

局部初始化


import pytest
import allure



@pytest.fixture(scope='class')
def setup():
    print("\n----------setup------------")
    yield
    print("\n---------Teardown---------")


array = [1,2,3,4]


@pytest.mark.parametrize("num", array)
class Test_fixtureModule():#Test开头,大写
    @allure.feature("模块名称")
    @allure.story("用户故事")
    @allure.severity("Blocker")  # 优先级,Blocker/Critical/Nomal/Minor/Trivial
    @allure.description("描述内容")
    def test_fixtureModule(self,num,setup):#test开头,小写
        print(num)
        assert 1 == 1


'''
============================= test session starts =============================
collecting ... collected 4 items

test_fixtureClass.py::Test_fixtureModule::test_fixtureModule[1] 
======= Global initialization =======

----------setup------------
PASSED   [ 25%]1

test_fixtureClass.py::Test_fixtureModule::test_fixtureModule[2] PASSED   [ 50%]2

test_fixtureClass.py::Test_fixtureModule::test_fixtureModule[3] PASSED   [ 75%]3

test_fixtureClass.py::Test_fixtureModule::test_fixtureModule[4] PASSED   [100%]4

---------Teardown---------

======= Global cleanup =======


============================== 4 passed in 0.02s ==============================

Process finished with exit code 0

'''

 


import pytest
import allure



@pytest.fixture(scope='function')
def setup():
    print("\n----------setup------------")
    yield
    print("\n---------Teardown---------")


array = [1,2,3,4]


@pytest.mark.parametrize("num", array)
class Test_fixtureFunction():#Test开头,大写
    @allure.feature("模块名称")
    @allure.story("用户故事")
    @allure.severity("Blocker")  # 优先级,Blocker/Critical/Nomal/Minor/Trivial
    @allure.description("描述内容")
    def test_fixtureFunction(self,num,setup):#test开头,小写
        print(num)
        assert 1 == 1

'''
============================= test session starts =============================
collecting ... collected 4 items

test_fixtureFunction.py::Test_fixtureFunction::test_fixtureFunction[1] 
======= Global initialization =======

----------setup------------
PASSED [ 25%]1

---------Teardown---------

test_fixtureFunction.py::Test_fixtureFunction::test_fixtureFunction[2] 
----------setup------------
PASSED [ 50%]2

---------Teardown---------

test_fixtureFunction.py::Test_fixtureFunction::test_fixtureFunction[3] 
----------setup------------
PASSED [ 75%]3

---------Teardown---------

test_fixtureFunction.py::Test_fixtureFunction::test_fixtureFunction[4] 
----------setup------------
PASSED [100%]4

---------Teardown---------

======= Global cleanup =======
'''

import pytest
import allure



@pytest.fixture(scope='module')
def setup():
    print("\n----------setup------------")
    yield
    print("\n---------Teardown---------")


array = [1,2,3,4]


@pytest.mark.parametrize("num", array)
class Test_fixtureModule():#Test开头,大写
    @allure.feature("模块名称")
    @allure.story("用户故事")
    @allure.severity("Blocker")  # 优先级,Blocker/Critical/Nomal/Minor/Trivial
    @allure.description("描述内容")
    def test_fixtureModule(self,num,setup):#test开头,小写
        print(num)
        assert 1 == 1

'''
============================= test session starts =============================
collecting ... collected 4 items

..\ModelC\test_fixtureModule.py::Test_fixtureModule::test_fixtureModule[1] 
======= Global initialization =======

----------setup------------
PASSED [ 25%]1

..\ModelC\test_fixtureModule.py::Test_fixtureModule::test_fixtureModule[2] PASSED [ 50%]2

..\ModelC\test_fixtureModule.py::Test_fixtureModule::test_fixtureModule[3] PASSED [ 75%]3

..\ModelC\test_fixtureModule.py::Test_fixtureModule::test_fixtureModule[4] PASSED [100%]4

---------Teardown---------

======= Global cleanup =======

'''


import pytest
import allure



@pytest.fixture(scope='session')
def setup():
    print("\n----------setup------------")
    yield
    print("\n---------Teardown---------")


array = [1,2,3,4]


@pytest.mark.parametrize("num", array)
class Test_fixtureSession():#Test开头,大写
    @allure.feature("模块名称")
    @allure.story("用户故事")
    @allure.severity("Blocker")  # 优先级,Blocker/Critical/Nomal/Minor/Trivial
    @allure.description("描述内容")
    def test_fixtureSession(self,num,setup):#test开头,小写
        print(num)
        assert 1 == 1

'''
============================= test session starts =============================
collecting ... collected 4 items

test_fixtureSession.py::Test_fixtureSession::test_fixtureSession[1] 
======= Global initialization =======

----------setup------------
PASSED [ 25%]1

test_fixtureSession.py::Test_fixtureSession::test_fixtureSession[2] PASSED [ 50%]2

test_fixtureSession.py::Test_fixtureSession::test_fixtureSession[3] PASSED [ 75%]3

test_fixtureSession.py::Test_fixtureSession::test_fixtureSession[4] PASSED [100%]4

---------Teardown---------

======= Global cleanup =======


============================== 4 passed in 0.01s ==============================

Process finished with exit code 0

'''

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

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

相关文章

VR全景如何制作,可以用在哪些领域?

引言: 虚拟现实(VR)全景制作正在以惊人的速度改变着我们的感官体验。通过VR全景技术,我们可以身临其境地探索虚拟世界,感受前所未有的沉浸式体验。 一.如何进行VR全景制作 1.什么是VR全景制作&#xff1f…

【雕爷学编程】Arduino动手做(127)---2004A LCD液晶屏模块

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

【状态估计】基于卡尔曼滤波器和扩展卡尔曼滤波器用于 INS/GNSS 导航、目标跟踪和地形参考导航研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

计算机网络——自顶向下方法(第五章学习记录)

本章学习网络层:控制平面 控制平面作为一种网络范围的逻辑,不仅控制沿着从源主机到目的主机的端到端路径间路由器如何转发数据报,而且控制网络层组件和服务如何配置和管理。 概述 通过前面的学习,我们已经知道转发表&#xff0…

Android使用echart展示图表

Android使用echart展示酷炫的图表 最近开发的时候,遇到了柱状图,刻度图等各种图表的展示。查资料发现,Android用的的最多的是MPAndroidChart,我也尝试了,一般的柱状图和饼状图都可以实现,但是刻度图就不行…

【复习《剑指Offer》1-5题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第六天 6/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】

环境搭建 1.项目工具 本项目涉及到的工具都有在云盘提供,自行下载即可 JDK8IDEA2021Tomcat8.5MySQL的客户端工具SQLYog… 2.项目搭建 通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp 设置项目的基础信息 3.基本配置 3.1 JDK配置 JDK使用的…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…

开发吐槽,谁说测试是二等公民,我们才是好吧

很多测试都认为自己是团队中的二等公民&#xff0c;从而各种看衰作贱自己。 这不&#xff0c;昨天在知乎上就看到一篇帖子&#xff1a;一女测试在团队中各种嘲讽自己的测试团队&#xff0c;“测试是低人一等的职业”&#xff0c;时刻劝说大家转开发。最后团队领导受不了&#…

机器学习:简介与类型

从翻译应用、商品推荐、医疗诊断到自动驾驶汽车&#xff0c;机器学习 (ML) 作为一种技术&#xff0c;都有用武之地。机器学习提供了一种解决问题、回答复杂问题以及创建新内容的新方式。机器学习可以预测天气、估算行程时间、推荐歌曲、自动补全句子、汇总文章以及生成全新的图…

【数据结构】串的基本定义及操作

&#x1f387;[数据结构]串的基本定义及操作&#x1f387; &#x1f308;积薪高于山&#xff0c;焉用先后别 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]串的基本定义及操作&#x1f387;&…

【运维心得】SAP EPM Add-In加载错误的另类解决方案

关键字&#xff1a;SAP BPC EPM OFFICE WPS 今天又解决了一个诡异的问题&#xff0c;记录一下&#xff0c;以备将来能够用上。 目录 问题现象 网上的方法 启发和解决 结论 问题现象 财务SAP系统需要BPC模块做报表&#xff0c;安装了OfficeEPM Add-In以后&#xff0c;结果…

抖音私域怎么做?

“私域流量”是如今备受市场瞩目的话题之一。众所周知&#xff0c;腾讯、阿里巴巴、抖音等互联网巨头已经开始布局私域资源&#xff0c;因此许多企业都希望在这些平台上获取生意增长。作为具有6亿日活跃用户的短视频平台&#xff0c;抖音也为企业提供了私域运营的阵地。那么&am…

2023年湖北黄冈人社局初、中级职称怎么评?申报条件是什么?启程别

2023年湖北黄冈人社局初、中级职称怎么评&#xff1f;申报条件是什么&#xff1f;启程别 想要评过人社局的初、中级职称&#xff0c;首先要满足申报条件&#xff0c;其次是要准备好申报资料&#xff0c;最后等待申报时间提交资料&#xff0c;等待结果。湖北目前改外全面线上申报…

SAP从入门到放弃系列之BOM技术类型-派生BOM-Part5

文章导航目录 一、概述二、基本概念-BOM技术类型三、BOM技术类型详解3.1、BOM技术类型-简单BOM&多重BOM 3.2、BOM技术类型-派生BOM 四、测试示例&#xff1a;4.1、数据准备4.2、创建派生BOM4.3、调整BOM组&#xff0c;更新派生BOM 一、概述 本来想在介绍BOM组的时候写这个…

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件&#xff08;诸如Get或Put&#xff09;之前或之后发生&#xff0c;相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程&#xff0c;因为它可以让你在RegionServer上对数据执行自定义计算&#xff0c;而不是在客户端上执行…

MATLAB 之 对话框设计实例和菜单设计

这里写目录标题 一、对话框设计实例1. 数值转化2. 图形演示 二、菜单设计1. 建立用户菜单2. 菜单对象常用属性3. 快捷菜单 一、对话框设计实例 在上一篇博客当中&#xff0c;我们介绍了控件的基本操作&#xff0c;这是建立对话框的基础。下面我们举两个例子&#xff0c;用以说…

软件测试工程师最常用的Linux系统命令大全(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 cd命令 这是一个…

最新导则下生态环评报告编制技术

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、 10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量…

开窗函数之聚合、取特定值、排名

一&#xff0c; 聚合开窗函数sum(score) over(partition by name ) 二&#xff0c;开窗函数之first_value&#xff0c;last_value&#xff0c;lead&#xff0c;lag 三&#xff0c;排名开窗函数ROW_NUMBER、DENSE_RANK、RANK 一&#xff0c;开窗函数的语法 开窗函数的语法为&am…